前言

  Socket的英文原义是“孔”或“插座”,其实在网络编程中Socket就是这个意思,就像我们打电话,要首先知道对方的手机号一样,这个手机号就相当于一个Socket号、一个插座,在网络编程中就是ip+端口作为一个插座。

实现

  System.Net.Sockets命名空间下提供了Socket类,使.net下Socket变得很简单,Socket实现点对点通信有两种方式,一种是用服务器转接,所有的客户端都发送到服务端,客户端只做客户端;另一种是客户端既是服务端又是服务端,就是既监听又发送信息。这篇就用第二种方式简单实现下,首先看下简单示意图:

aaarticlea/png;base64,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" alt="" />

  发送信息代码:

   string message = txtMsg.Text.Trim();
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string remoteIp = this.txtRemoteIP.Text;
string remotePort = this.txtRemotePort.Text;
int serverPort = Convert.ToInt32(remotePort);
IPAddress serverIp = IPAddress.Parse(remoteIp);
IPEndPoint remoteIep = new IPEndPoint(serverIp, serverPort);
socketClient.Connect(remoteIep);
toolStripStatusLabel1.Text = "与远程计算机" + remoteIp + ":" + remotePort + "建立连接!"; byte[] byteMessage = Encoding.Default.GetBytes(message);
socketClient.Send(byteMessage); IPHostEntry host = Dns.GetHostEntry(GetServerIP());
string HostName = host.HostName; //发送信息
string time1 = DateTime.Now.ToString();
listBox1.Items.Add(GetServerIP().ToString() + "(" + HostName + ") " + time1);
listBox1.Items.Add(message); socketClient.Shutdown(SocketShutdown.Both);
socketClient.Close();

  IPEndPoint从这个单词的意思就可以看出是一个远端的地址信息,Connect方法根据这个地址建立链接,然后调用Send方法向远端发送信息,发送完信息之后要使用Shutdown指向当前Socket是否接受发送消息,下面列出SocketShutdown的枚举值:

描述

Send

禁用此 Socket 上的发送。

Receive

禁用此 Socket 上的接收。

Both

同时禁用此 Socket 上的发送和接收。

  Shutdown在msdn上解释是这样的:如果当前使用的是面向连接的Socket,则必须先调用 Shutdown 方法,然后才能关闭Socket。这可以确保在已连接的套接字关闭之前,已发送和接收该套接字上的所有数据。Shutdown也是关闭的意思,其实关于Shutdown和Close我在网上找了很多资料,关于Shutdown解释的云里雾里,不是很明白,我这样理解不知道对不对,上面打电话的例子,按号码打通电话说完话按下挂机键,Shutdown的意思这样,确保信息已经发送。

  监听代码:

    socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    IPAddress ServerIp = GetServerIP();
IPEndPoint iep = new IPEndPoint(ServerIp, port);
socketServer.Bind(iep); while (true)
{
try
{
socketServer.Listen();
allDone.Reset();
socketServer.BeginAccept(new AsyncCallback(AcceptCallback), socketServer);
allDone.WaitOne();
}
catch (SocketException ex)
{
toolStripStatusLabel1.Text += ex.ToString();
}
}

  Bind与本机绑定开通这个“号码”以方便别人可以打进来,Listen(5)5的意思是最大的监听数,BeginAccept的意思是开始一个异步操作来接受一个传入的连接尝试,以异步方式接受连接将使您能够在单独的执行线程中发送和接收数据,回调方法使用EndAccept,并返回新的Socket对象。

     //异步连接回调函数
public void AcceptCallback(IAsyncResult ar)
{
Socket listener = (Socket)ar.AsyncState;
Socket client = listener.EndAccept(ar);
allDone.Set();
StateObject state = new StateObject();
state.workSocket = client;
client.BeginReceive(state.buffer, , StateObject.BufferSize, , new AsyncCallback(readCallback), state);
} //异步接收回调函数
public void readCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
int bytesRead = handler.EndReceive(ar);
if (bytesRead > )
{
string strmsg = Encoding.Default.GetString(state.buffer, , bytesRead); //远端信息
EndPoint tempRemoteEP = handler.RemoteEndPoint;
IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP;
IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address);
string HostName = host.HostName; string ip = tempRemoteIP.Address.ToString() + "(" + HostName + ") " + DateTime.Now.ToString();
if (listBox1.InvokeRequired)
{
MyDelegate md;
md = new MyDelegate(ChangeText);
listBox1.Invoke(md, ip, strmsg);
}
}
}

  listener.EndAccept(ar)和handler.EndReceive(ar)取回远端Socket对象,这边注意下获取IPHostEntry对象并不是用GetHostEntry方法,而是GetHostByAddress方法,使用GetHostEntry方法会产生异常,异步调用传输对象StateObject:

      //异步传递的状态对象
public class StateObject
{
public Socket workSocket = null;
public const int BufferSize = ;
public byte[] buffer = new byte[BufferSize];
}

  运行截图:

  完整代码:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; using System.Threading;
using System.Net;
using System.Net.Sockets; namespace ClientSocket
{
public partial class Form1 : Form
{
Socket socketClient;
Thread mythread;//创建线程
Socket socketServer;
int port = ;//定义侦听端口号
public static ManualResetEvent allDone = new ManualResetEvent(false);
public delegate void MyDelegate(string ip,string message); public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
mythread = new Thread(new ThreadStart(BeginListen));
mythread.Start(); txtRemoteIP.Text = GetServerIP().ToString();
} #region server
//获取本机IP地址
public static IPAddress GetServerIP()
{
IPHostEntry ieh = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress item in ieh.AddressList)
{
if (item.ToString().IndexOf("192.168.0.")>=)
{
return item;
}
}
return null;
} //异步传递的状态对象
public class StateObject
{
public Socket workSocket = null;
public const int BufferSize = ;
public byte[] buffer = new byte[BufferSize];
} //监听
private void BeginListen()
{
socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ServerIp = GetServerIP();
IPEndPoint iep = new IPEndPoint(ServerIp, port);
socketServer.Bind(iep); while (true)
{
try
{
socketServer.Listen();
allDone.Reset();
socketServer.BeginAccept(new AsyncCallback(AcceptCallback), socketServer);
allDone.WaitOne();
}
catch (SocketException ex)
{
toolStripStatusLabel1.Text += ex.ToString();
}
}
} //异步连接回调函数
public void AcceptCallback(IAsyncResult ar)
{
Socket listener = (Socket)ar.AsyncState;
Socket client = listener.EndAccept(ar);
allDone.Set();
StateObject state = new StateObject();
state.workSocket = client;
client.BeginReceive(state.buffer, , StateObject.BufferSize, , new AsyncCallback(readCallback), state);
} //异步接收回调函数
public void readCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
int bytesRead = handler.EndReceive(ar);
if (bytesRead > )
{
string strmsg = Encoding.Default.GetString(state.buffer, , bytesRead); //远端信息
EndPoint tempRemoteEP = handler.RemoteEndPoint;
IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP;
IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address);
string HostName = host.HostName; string ip = tempRemoteIP.Address.ToString() + "(" + HostName + ") " + DateTime.Now.ToString();
if (listBox1.InvokeRequired)
{
MyDelegate md;
md = new MyDelegate(ChangeText);
listBox1.Invoke(md, ip, strmsg);
}
}
} public void ChangeText(string ip,string message)
{
listBox1.Items.Add(ip);
listBox1.Items.Add(message);
} #endregion #region client
//发送信息
private void btn_Send_Click(object sender, EventArgs e)
{
try
{
string message = txtMsg.Text.Trim();
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string remoteIp = this.txtRemoteIP.Text;
string remotePort = this.txtRemotePort.Text;
int serverPort = Convert.ToInt32(remotePort);
IPAddress serverIp = IPAddress.Parse(remoteIp);
IPEndPoint remoteIep = new IPEndPoint(serverIp, serverPort);
socketClient.Connect(remoteIep);
toolStripStatusLabel1.Text = "与远程计算机" + remoteIp + ":" + remotePort + "建立连接!"; byte[] byteMessage = Encoding.Default.GetBytes(message);
socketClient.Send(byteMessage); IPHostEntry host = Dns.GetHostEntry(GetServerIP());
string HostName = host.HostName; //发送信息
string time1 = DateTime.Now.ToString();
listBox1.Items.Add(GetServerIP().ToString() + "(" + HostName + ") " + time1);
listBox1.Items.Add(message); socketClient.Shutdown(SocketShutdown.Both);
socketClient.Close();
}
catch
{
toolStripStatusLabel1.Text = "无法连接到目标计算机!";
return;
}
} private void btnClose_Click(object sender, EventArgs e)
{
Application.Exit();
}
#endregion
}
}

  程序下载:Socket点对点通信.rar

  附录:小菜学习编程-Winform系列(初学者)

小菜学习Winform(三)Socket点对点通信的更多相关文章

  1. 小菜学习Winform(一)贪吃蛇2

    前言 上一篇<小菜学习Winform(一)贪吃蛇>中实现了简单版的贪吃蛇,在文章末也提到需要优化的地方,比如使用oo.得分模式.速度加快模式和减少界面重绘.因为是优化篇,实现方式上一篇有, ...

  2. 小菜学习Winform(七)系统托盘

    前言 有些程序在关闭或最小化的时候会隐藏在系统托盘中,双击或右击会重新显示,winform实现其功能很简单,这边就简单的介绍下. 实现 在winform实现托盘使用notifyIcon控件,如果加菜单 ...

  3. 小菜学习Winform(六)剪切板和拖放复制

    前言 在做winform项目的时候有时候会用到复制粘贴,在.net中提供了Clipboard类来操作剪切板,我们来看下. clipbrd.exe clipbrd是系统剪切板程序,但是在vista及以上 ...

  4. 小菜学习Winform(五)窗体间传递数据

    前言 做项目的时候,winfrom因为没有B/S的缓存机制,窗体间传递数据没有B/S页面传递数据那么方便,今天我们就说下winfrom中窗体传值的几种方式. 共有字段传递 共有字段传递实现起来很方便, ...

  5. 小菜学习Winform(四)MDI窗体(附示例)

    前言 在做winfrom项目的时候我们可能会用到嵌套窗体,就是说一个容器中有多个窗体,可以分别管理和应用这些窗体,.net中提供了一种机制就是MDI,可能大家都会用,这边就简单的介绍下. 简单应用 w ...

  6. 小菜学习Winform(二)WMPLib实现音乐播放器

    前言 现在网上有很多的音乐播放器,但好像都不是.net平台做的,在.net中实现音乐文件的播放功能很简单,下面就简单实现下. SoundPlayer类 在.net提供了音乐文件的类:SoundPlay ...

  7. 小菜学习Winform(一)贪吃蛇

    前言 说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧. 实现 其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及 ...

  8. 小菜学习编程-Winform系列(初学者)

    前言 记得上次写<小菜的程序员道路(二)>,这篇文章的时候说过,要把工作以来整理的编程知识分享给大家,因为这半年来的工作实在是忙,现在也在忙着公司产品上线,但是答应的一定要实现,大家看我上 ...

  9. 小菜学习设计模式(三)—工厂方法(Factory Method)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

随机推荐

  1. host Object和native Object的区别

    Native Object: JavaScript语言提供的不依赖于执行宿主的对象,其中一些是内建对象,如:Global.Math:一些是在脚本运行环境中创建来使用的,如:Array.Boolean. ...

  2. 【Beta】Daily Scrum Meeting第七次

    1.任务进度 学号 已完成 接下去要做 502 发布任务到服务器 测试 509 将各api的处理逻辑放到类里面 让主api调用这些类 517 删除任务和教师的控件及逻辑 提交报课审核信息 530 完善 ...

  3. Web Components初探

    本文来自 mweb.baidu.com 做最好的无线WEB研发团队 是随着 Web 应用不断丰富,过度分离的设计也会带来可重用性上的问题.于是各家显神通,各种 UI 组件工具库层出不穷,煞有八仙过海之 ...

  4. Django开发笔记

    django基础之视图 1.在Django中网页前端的页面和其他内容都是由视图来传递的(视图对web请求进行回应)Django通过检查请求的URL(准确地说,是URL里域名之后的那部分)来选择使用哪个 ...

  5. 春节前最后一篇,CRUD码农专用福利:PDF.NET之SOD Version 5.1.0 开源发布(兼更名)

    废话不多说,直接入正题,明天赶着坐火车回老家过年. 从2013.10.1日起,原PDF.NET将更名为 SOD :- one SQL-MAP,ORM,Data Control framework 原P ...

  6. Centos7下安装mono3.10.0

    mono 3.10.0 正式发布:性能进一步改进,以前已经写过一篇  Centos 7.0 安装Mono 3.4 和Jexus 5.6.下面我们在CentOS 7上通过源码安装Mono 3.10, 需 ...

  7. SVG学习备忘录

    最近在写一个基于SVG的前端流程图\拓扑图图形框架. 一些容易忽略的问题备忘如下: 1.JS添加SVG元素需要使用document.createElementNS("http://www.w ...

  8. HTML和CSS经典布局2

    如下图: 需求: 1. 如图 2. 可以从body标签开始. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xht ...

  9. 走向面试之数据库基础:二、SQL进阶之case、子查询、分页、join与视图

    一.CASE的两种用法 1.1 等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHE ...

  10. Go语言实战 - revel框架教程之权限控制

    一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构的,每一个url其实都会映射到一个具体的Cont ...