C# socket通信 模拟服务器端、客户端
来源:互联网 发布:祥南行书体 mac 编辑:程序博客网 时间:2024/05/02 22:51
项目名---右键-----调试-------启动新实例(实现开启多个项目)
socket用户描述IP地址和端口,是一个通信链的句柄。
将远程连接的客户端的IP地址和Socket存入Dirtionary<string ,socket>中,用来实现服务器与多个客户端通信
Telnet一个本地连接的服务器,打开连接:win+R; cmd telnet 192.168.22.22+端口号
模拟服务器与客户端的通信socket用户描述IP地址和端口,是一个通信链的句柄。
服务端
实现:
namespace socket{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { } /// <summary> /// 服务器端的监听 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { try { //当点击开始监听的时候,在服务器端创建一个监听IP地址和端口号的socket(负责监听) // 绑定监听端口 Socket socketwatch = new Socket(AddressFamily.InterNetwork ,SocketType.Stream,ProtocolType.Tcp); IPAddress ip = IPAddress.Any; // IPAddress ip= IPAddress.Parse(Server.Text); // 创建端口号对象 IPEndPoint point = new IPEndPoint(ip,Convert.ToInt32(textport.Text)); //监听 socketwatch.Bind(point); // 监听的目的是等待其他的连接;连接后,负责监听的socket调用accept,创建了负责与客户端连接的socket Showmes("监听成功"); //一个时间点最大的连接数量 监听 socketwatch.Listen(10); //Accept 等待客户端的连接 // 要处理的问题:1、Accept() 需要一个线程来处理,不能放在主线程中。2、可以等待多个,而不是一个 Thread th = new Thread(listen); th.IsBackground = true; th.Start(socketwatch ); // 负责监听的socket } catch { // 即使出现了异常,也不会抛出 } } /// <summary> /// 等待客户端的连接,并且创建与之通信的socket ,写成循环是因为每一个连接都会创建了一个通信socket /// </summary> /// <returns></returns> public void listen(object o) { try { Socket socketwatch = o as Socket; // 这个socket是负责监听的 as:类型转换,如果转换成功,返回转换结果,否则null. while (true) { Socket socketSend = socketwatch.Accept();// 这个方法可以接受客户端的连接,监听的socket为新连接创建一个负责通信的socket Showmes(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");// 通过这个属性(RemoteEndPoint)拿到远程客户端的ip地址和端口号 // 客户端连接成功后,服务器应该接受客户端发过来的消息:这些都是由负责通信的socket来处理,监听的socket不再用 Thread thr = new Thread(receive); thr.IsBackground = true; thr.Start(socketSend); } } catch { } } /// <summary> /// 服务器端不停的接收发过来的数据 /// </summary> public void receive(object o) { Socket socketSend = (Socket)o; while(true){ // 在网络通信中,经常会发生各种异常,所以注意异常处理 try { byte[] bb = new byte[1024 * 1024]; int realnum = socketSend.Receive(bb); //将接受的数据放在byte[]中,实际接受了realnum个 if (realnum == 0) { break; // 如果客户端下线后,整个程序没有要结束的条件,一直在发空;所以,当接受到空时,结束 } string realstr = Encoding.Default.GetString(bb, 0, realnum); // txtlog.Text = realstr; Showmes(socketSend.RemoteEndPoint + ":" + realstr); // 内容是远程地址和端口号:内容 } catch { } } } public void Showmes(string str) { txtlog.AppendText(str+"\r\n"); } private void textport_TextChanged(object sender, EventArgs e) { } private void Form1_Load(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false;// 取消跨线程的操作 } }}
客户端
namespace client{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } Socket socketsend; private void button1_Click(object sender, EventArgs e) { // 创建负责通信的socket socketsend = new Socket(AddressFamily .InterNetwork ,SocketType .Stream ,ProtocolType.Tcp);//InterNetwork代表IPV4 //获得IP地址和端口号 IPAddress ip = IPAddress.Parse(textBox3 .Text ); //获得要连接远程服务器端的IP地址 IPEndPoint point = new IPEndPoint(ip,Convert .ToInt32 (textBox1 .Text )); //获得要连接的远程应用程序的IP地址和端口号 socketsend.Connect(point); showmess("连接成功"); } public void showmess(string str) { textBox2.Text = str + "\r\n"; } private void button2_Click(object sender, EventArgs e) { byte[] bs=new byte[1024]; bs=Encoding.Default .GetBytes ( textBox4 .Text ); int nums=socketsend .Send(bs ); } }}
阅读全文
0 0
- C# socket通信 模拟服务器端、客户端
- C# Socket通信 客户端 服务器端代码
- android 客户端 C#服务器端 socket 通信
- PHP客户端与C#服务器端 Socket通信
- C#一个服务器端多个客户端Socket通信
- C#服务器端与客户端通信(客户端)
- Java Socket 模拟客户端与服务器端通讯
- java之Socket模拟服务器端与客户端
- socket编程---服务器端与客户端简单通信
- 底层通信,socket 服务器端 和客户端
- socket编程---服务器端与客户端简单通信
- 实现服务器端和客户端的Socket通信
- Java Socket通信 客户端服务器端基本代码
- C++ socket 通信客户端和服务器端
- android客户端与服务器端socket通信
- C++ socket 通信客户端和服务器端
- socket编程---服务器端与客户端简单通信
- Socket通信 客户端和服务器端的通信 客户端
- dubbo-Admin JDK1.8 启动报错
- Python进阶(四十九)-初识Flask Blueprint
- ORClE数据库实验 —
- Linux服务器 CentOS 6系列最小化安装优化脚本详解01————yum优化、优化启动服务、调整TTY数量、调整TCP/IP网络参数
- 【HDU 1754】I Hate It
- C# socket通信 模拟服务器端、客户端
- java 位运算
- 编程第四十八天
- hihocoder1014(Trie树)
- 【Studio】利用Android Studio录制手机屏幕视频
- Linux 几个生疏命令
- 设计模式
- 浅析c#委托
- Web安全测试经验