Socket通信可实现服务器和客户端进行通信,通过socket来实现监听/接收/发送。(所有代码为测试成功)

依据通信步骤实现通信。

服务器端界面以及代码:

服务器端开始监听的通信步骤:

1.创建一个用于监听连接的Socket对象

2.指定端口号和服务器的ip建立一个EndPoint对象

3.用socket对象的Bind()方法绑定EndPoint

4.用socket对象的Listen()方法开始监听

5.接收到客户端的连接,用socket的Accept()方法创建一个用于和客户端进行通信的Socket对象

6.通信结束后,关闭socket

//定义回调:解决跨线程访问控件问题
private delegate void SetTextValueCallBack(string strValue);
private SetTextValueCallBack setCallBack;
//定义接收客户端发送消息的回调
private delegate void ReceiveMsgCallBack(string strReceive);
private ReceiveMsgCallBack receiveMsgCallBack;
//定义回调给Combobox控件添加元素
private delegate void SetCmbCallBack(string item);
private SetCmbCallBack setCmbCallBack;
//定义发送文件的回调
private delegate void SendFileCallBack(byte[] bf);
private SendFileCallBack sendCallBack;//用于通信的Socket
Socket socketSend;
//用于监听的Socket
Socket socketWatch;//将远程连接的客户端IP地址和Socket存入集合中
Dictionary<string,Socket> dicSocket=new Dictionary<string,Socket>();//创建用于监听连接的线程
Thread AcceptSocketThread;
//接收客户端发送消息的线程
Thread threadReceive;public Server()
{InitializeComponent();
}//开始监听
private void btnStartListen_Click(object sender,EventArgs e)
{//当点击开始监听的时候,在服务器端创建一个负责监听IP地址和端口号的SocketsocketWatch=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//获取IP地址,这里的ip和端口号为服务器的,所有的客户端都要和服务器的这个端口号连接IPAddress ip=IPAddress.Parse(txtIP.Text.Trim());//创建端口号IPEndPoint point=new IPEndPoint(ip,Convert.ToInt32(txtPort.Text.Trim()));//监听的socket绑定IP地址和端口号socketWatch.Bind(point);txtInforLog.AppendText("监听成功"+Environment.NewLine);//开始监听,设置最大可以同时连接多少和请求socketWatch.Listen(10);//实例化回调setCallBack=new SetTextValueCallBack(SetTextValue);receiveMsgCallBack=new ReceiveMsgCallBack(ReceiveMsg);setCmbCallBack=new SetCmbCallBack(AddCmbItem);sendCallBack=new SendFileCallBack(SendFile);//创建开始监听的线程AcceptSocketThread=new Thread(new ParameterizedThreadStart(StartListen));AcceptSocketThread.IsBackground=true;AcceptSocketThread.Start(socketWatch);
}//等待客户端的连接,并且创建与之通信的Socket
private void StartListen(object obj)
{Socket socketWathch=obj as Socket;while(true){//等待客户端的连接,并且创建一个用于通信的Socket,这里如果没有客户端的连接会阻塞socketSend=socketWatch.Accept();//获取远程主机的ip地址和端口号(strIp的格式:127.0.0.1:8887)string strIP=socketSend.RemoteEndPoint.ToString();dicSocket.Add(strIP,socketSend);cmbClient.Invoke(setCmbCallBack,strIP);string strMsg="远程主机:"+socketSend.RemoteEndPoint+"连接成功";//使用回调txtConnectLog.Invoke(setCallBack,strMsg);//定义接收客户端消息的线程Thread threadReceive=new Thread(new ParameterizedThreadStart(Receive));threadReceive.IsBackground=true;threadReceive.Start(socketSend);}
}//服务器端不停接收客户端发送的消息
private void Receive(object obj)
{Socket socketSend=obj as Socket;while(true){//客户端连接成功后,服务器接收客户端发送的消息byte[] buffer=new byte[2048];      //实际接收的有效字节数int count=socketSend.Receive(buffer);//count==0表示客户端关闭,退出循环if(count==0){break;}  else{string str=Encoding.Default.GetString(buffer,0,count);string strReceiveMsg="接收:"+socketSend.RemoteEndPoint+" 发送的消息:"+str;txtInforLog.Invoke(receiveMsgCallBack,strReceiveMsg);}}
}
//回调委托需要执行的方法
private void SetTextValue(string strValue)
{txtInforLog.AppendText(strValue+Environment.NewLine);
}
private void ReceiveMsg(string strReceive)
{txtInforLog.AppendText(strReceive+Environment.NewLine);
}
private void AddCmbItem(string item)
{cmbClient.Items.Add(item);
}//服务器给客户端发送消息
private void btnSendInfor_Click(object sender,EventArgs e)
{string str=txtMsg.Text.Trim();byte[] buffer=Encoding.Default.GetBytes(str);List<byte> list=new List<byte>();list.Add(0);list.AddRange(buffer);//将泛型集合转换为数组byte[] newBuffer=list.ToArray();//获得用户选择的ip地址string ip=cmbClient.SelectedItem.ToString();dicSocket[ip].Send(newBuffer);
}//选择需要发送的文件
private void btnChooseFile_Click(object sender,EventArgs e)
{OpenFileDialog dia=new OpenFileDialog();//设置初始目录dia.InitialDirectory=@"";dia.Title="请选择要发送的文件";//过滤文件类型dia.Filter="所有文件|*.*";dia.ShowDialog();//将选择的文件的路径赋值给文本框txtMsg.Text=dia.FileName;
}//发送文件
private void btnSendFile_Click(object sender,EventArgs e)
{List<byte> list=new List<byte>();//获取要发送的文件的路径string strPath=txtMsg.Text.Trim();using(FileStream sw=new FileStream(strPath,FileMode.Open,FileAccess.Read)){byte[] buffer=new byte[2048];int r=sw.Read(buffer,0,buffer.Length);list.Add(1);list.AddRange(buffer);byte[] newBuffer=list.ToArray();btnSendFile.Invoke(sendCallBack,newBuffer);}
}//向指定的客户端发送流
private void SendFile(byte[] bf)
{dicSocket[cmbClient.SelectedItem.ToString()].Send(bf,SocketFlags.None);
}//停止监听
private void btnStopListen_Click(object send,EventArgs e)
{socketWatch.Close();socketSend.Close();AcceptSocketThread.Abort();threadReceive.Abort();
}

2.客户端:

客户端开始监听的通信步骤:

1.建立一个socket对象

2.用指定的端口号和服务器的IP建立一个EndPoint对象

3.用socket对象的Connect()方法以上面 的EndPoint对象作为参数,向服务器发出连接请求

4.如果连接成功,就用socket()对象的Send()方法向服务器发送信息

5.用socket对象的Receive()方法接收服务器发来的信息

6.通信结束后关闭Socket

//定义回调
private delegate void SetTextCallBack(string strValue);
private SetTextCallBack setCallBack;//定义接收服务器端发送消息的回调
private delegate void ReceiveMsgCallBack(string strMsg);
private ReceiveMsgCallBack receiveCallBack;//创建连接的Socket
Socket socketSend;
//创建接收客户端发送消息的线程
Thread threadReceive;//连接服务器
private void btnConnect_Click(object sender,EventArgs e)
{socketSend=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPAddress ip=IPAddress.Parse(txtIP.Text.Trim());socketSend.Connect(ip,Convert.ToInt32(txtPort.Text.Trim()));//实例化回调setCallBack=new SetTextCallBack(setValue);receiveCallBack=new ReceiveMsgCallBack(setValue);txtReceiveInfor.Invoke(setCallBack,"连接成功");//开启一个新的线程threadReceive=new Thread(new ThreadStart(Receive));//设置线程中可打开弹框threadReceive.SetApartmentState(ApartmentState.STA);threadReceive.IsBackground=true;threadReceive.Start();
}//接收来自服务器的信息
private void Receive ()
{while(true){byte[] buffer=new byte[2048];//实际接收的字节数int r=socketSend.Receive(buffer);if(r==0){break;}else{//判定接收到的服务器的数据类型if(buffer[0]==0){string str=Encoding.Default.GetString(buffer,1,r-1);txtReceiveInfor.Invoke(receiveCallBack,"接收远程服务器:"+socketSend.RemoteEndPoint+"发送的消息:"+str);}else if(buffer[0]==1){SaveFileDialog sfd=new SaveFileDialog ();sfd.InitialDirectory=@"";sfd.Title="请选择要保存的文件";sfd.Filter="所有文件|*.*";sfd.ShowDialog(this);string strPath=sfd.FileName;using(FileStream fs=new FileStream(strPath,FileMode.OpenOrCreate,FileAccess.Write)){fs.Write(buffer,1,r-1);}MessageBox.Show("保存文件成功!");}}}
}//显示当前接收的服务器的信息
private void setValue(string strValue)
{txtReceiveInfor.AppendText(strValue+Environment.NewLine);
}//客户端给服务器发送消息
private void btnSendInfor_Click(object sender,EventArgs e)
{string strMsg=txtSendInfor.Text.Trim();byte[] buffer=new byte[2048];buffer=Encoding.Default.GetBytes(strMsg);int receive=socketSend.Send(buffer);
}
//断开连接
private void btnDisConnect_Click(object sender,EventArgs e)
{//关闭SocketsocketSend.Close();//终止线程threadReceive.Abort();
}

Socket通信实例详解相关推荐

  1. android c++ socket编程,C++ 中 socket编程实例详解

    C++ 中 socket编程实例详解 sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW):基于TCP的soc ...

  2. TCP及socket通信原理详解

    TCP/IP原型 DARPA一个项目,逐渐演变而来的. 端口号 0~1023:管理员才有权限使用,永久地分配给某应用使用: 注册端口: 1024~41951:只有一部分被注册,分配原则上非特别严格: ...

  3. php 连接socket服务器_PHP-Socket服务端客户端发送接收通信实例详解

    Socket介绍 什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求 ...

  4. PHP-Socket服务端客户端发送接收通信实例详解

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://fighter.blog.51cto.com/1318618/1533957 So ...

  5. java condition详解_Java使用Condition控制线程通信的方法实例详解

    Java使用Condition控制线程通信的方法实例详解 发布于 2020-4-20| 复制链接 摘记: 本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下 ...

  6. java前端长连接框架_Java中Spring Boot+Socket实现与html页面的长连接实例详解

    Spring Boot+Socket实现与html页面的长连接,客户端给服务器端发消息,服务器给客户端轮询发送消息,附案例源码 功能介绍 客户端给所有在线用户发送消息客户端给指定在线用户发送消息服务器 ...

  7. C#Socket开发TCP详解(二)

    文章目录 C#Socket开发TCP详解(二)--面向连接的套接字编程 简介: **面向连接的套接字** 1.建立连接 2.发送和接收消息 3.关闭连接 C#Socket开发TCP详解(二)–面向连接 ...

  8. tcp网络通信教程 java_基于java TCP网络通信的实例详解

    JAVA中设计网络编程模式的主要有TCP和UDP两种,TCP是属于即时通信,UDP是通过数据包来进行通信,UDP当中就会牵扯到数据的解析和传送.在安全性能方面,TCP要略胜一筹,通信过程中不容易出现数 ...

  9. Java语言Socket接口用法详解

    Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...

  10. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...

最新文章

  1. 只学python能找工作吗-只学Python能找到工作吗?老男孩Python视频教程
  2. 英语应用文写作之感谢信
  3. Bootstrap源码分析之transition、affix
  4. java调用其他方法中的变量_Uipath中调用Python的方法
  5. Hibernate中session的get方法和load方法的区别
  6. 中国移动IM-飞信-0802上线新版本 试用手记
  7. 03_linux 常用命令(上)
  8. numpy.cumsum()函数
  9. 将多张图片缩小合为一张图片(千图成像)
  10. android slidemenu 折叠效果,左侧菜单栏折叠展开效果-超级简单
  11. xmind8 安装方法(old)
  12. ORA-39194: Table mode jobs require the tables to be comma separated.
  13. 匹配查询(Match)
  14. Kinect_人脸识别
  15. 我们为什么需要实时数据库?
  16. 德日车企瓜分美系车在华市场
  17. 计算机专业毕业文案,毕业微信朋友圈说说 2020毕业文案经典个性
  18. Java程序员的搞笑段子
  19. 运动装备怎么选?运动装备品牌排行榜
  20. 路由器与路由表 、ip数据包头的含义

热门文章

  1. 文字转化为二维码(数据加密)
  2. [ZT]完全用Linux工作,摈弃Windows
  3. k8s通过Service访问Pod
  4. 南安普顿大学人工智能硕士课程
  5. java文字格斗游戏
  6. [SUCCESS]前后端分离开发-入门案例 +VSCode安装
  7. 想改变Facebook? 先改变扎克伯格!
  8. URP管线下使用Dither做像素化风格
  9. 实现HTML的简单压缩
  10. Linux 终端浏览器 w3m