scoket通信窗体(加强)
作者:互联网
如果 客户端 连接不上 服务端,可能是没有开Telnet;Windows10没有telnet服务器端了,还有可能是IPv4写错了
想要安装Telnet可以打开windows的控制面板 然后打开"程序和功能" 然后点击"启动或关闭windows功能" 最后找到"telnet客户端和telnet服务器端"
1 namespace _Server_服务端_窗体_ 2 { 3 public partial class Form1 : Form 4 { 5 6 public Form1() 7 { 8 InitializeComponent(); 9 } 10 //将负责监听和通信的Socket写到方法外面,方便别的方法调用 11 Socket socketWatch; 12 Socket socketSend; 13 14 //用于存储IP地址和负责跟客户端通信的Socket 15 readonly Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>(); 16 17 18 private void BtnStart_Click(object sender, EventArgs e) 19 { 20 //创建一个负责监听“Socket” 21 socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 22 //建立IP地址和端口号 对象 23 IPAddress iP = IPAddress.Any; 24 //txtPort是个文本框 25 IPEndPoint iPEnd = new IPEndPoint(iP, Convert.ToInt32(txtPort.Text)); 26 //让负责监听的Socket绑定IP地址和端口号 27 socketWatch.Bind(iPEnd); 28 Show("监听成功"); 29 //设置监听的队列 30 socketWatch.Listen(10); 31 //负责监听的Socket 来接收客户端的连接 32 //开启一个新的线程来执行Listen方法 33 Thread th = new Thread(Listen); 34 th.IsBackground = true; 35 th.Start(socketWatch); 36 37 } 38 void Show(string str) 39 { 40 //txtLog:文本框 41 txtLog.AppendText(str + "\r\n"); 42 //txtLog.Text(); 会覆盖前一个文本 43 //txtLog.Text = str + "\r\n"; 44 } 45 /// <summary> 46 /// 监听客户端的连接 并创建与之通信的Socket 47 /// </summary> 48 /// <param name="o"></param> 49 void Listen(object o) 50 { 51 Socket socketWatch = o as Socket; 52 while (true) 53 { 54 try 55 { 56 //通过Accept()这个方法创建负责和客户端通信的Socket 57 socketSend = socketWatch.Accept(); 58 //将远程客户端的IP地址和端口号存储到ComboBox(下拉列表)中 59 cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString()); 60 61 //再将IP地址和IP地址所对应得Socket添加到键值对集合中 62 //RemoteEndPoint:获得远程终结点(也就是IPv4) 63 dicSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend); 64 65 Show(socketSend.RemoteEndPoint.ToString() + "连接成功"); 66 67 //开一个新线程不停的接受客户端发来的消息 68 Thread th2 = new Thread(Rec); 69 th2.IsBackground = true; 70 th2.Start(socketSend); 71 } 72 catch 73 { 74 75 } 76 } 77 } 78 79 80 /// <summary> 81 /// 不停的接收客户端发来的数据 82 /// </summary> 83 /// <param name="o"></param> 84 void Rec(object o) 85 { 86 Socket socketSend = o as Socket; 87 while (true) 88 { 89 try 90 { 91 //当客户端连接成功后,服务端就可以接收客户端发来的数据 92 byte[] vs = new byte[1024 * 1024 * 2]; 93 //服务端实际接收到是字节数组 94 //r:是实际接受的有效字节数 95 int r = socketSend.Receive(vs); 96 //当r=0是接收到的实际数据为空; 97 //表示客户端下线了,然后跳出循环 98 if (r == 0) 99 { 100 break; 101 } 102 103 //将字节数组转换成字符串 104 string str = Encoding.UTF8.GetString(vs, 0, r); 105 Show(socketSend.RemoteEndPoint.ToString() + ":" + str); 106 } 107 catch 108 { 109 110 } 111 } 112 } 113 114 private void Form1_Load(object sender, EventArgs e) 115 { 116 //在程序加载的时候 取消跨线程的检查 117 Control.CheckForIllegalCrossThreadCalls = false;//这种方式不是好方法,有好方法,用异步委托 118 } 119 120 /// <summary> 121 /// 服务端给客户端发送文字消息 122 /// </summary> 123 /// <param name="sender"></param> 124 /// <param name="e"></param> 125 private void BtnSend_Click(object sender, EventArgs e) 126 { 127 //txtMsg:文本框 128 byte[] vs = Encoding.UTF8.GetBytes(txtMsg.Text); 129 //将字节数组前面加“0”表示为发的是文本文件,后将新的字节数组发送 130 List<byte> list = new List<byte>(); 131 list.Add(0); 132 list.AddRange(vs); 133 //将集合转成字节数组 134 byte[] vs1 = list.ToArray(); 135 136 //获得在下拉框中选中的IP地址 137 //cboUsers:下拉菜单 138 string IP = cboUsers.SelectedItem.ToString(); 139 dicSocket[IP].Send(vs1); 140 } 141 142 private void BtnSelect_Click(object sender, EventArgs e) 143 { 144 // OpenFileDialog:显示一个标准对话框,提示用户打开文件。 145 OpenFileDialog ofd = new OpenFileDialog(); 146 ofd.InitialDirectory = @"C:\Users\顾守\OneDrive\桌面"; 147 ofd.Title = "请选择要发的文件"; 148 ofd.Filter = "文本文件|*.txt|音乐文件|*.mp3|图片文件1|*.jpg|所有文件|*.*"; 149 ofd.ShowDialog(); 150 //获得选中文件的路径 151 //txtPath:文本框 152 txtPath.Text = ofd.FileName; 153 } 154 /// <summary> 155 /// 发文件 156 /// </summary> 157 /// <param name="sender"></param> 158 /// <param name="e"></param> 159 private void BtnSendFile_Click(object sender, EventArgs e) 160 { 161 using (FileStream file = new FileStream(txtPath.Text, FileMode.Open, FileAccess.ReadWrite)) 162 { 163 byte[] vs = new byte[file.Length]; 164 //实际读取到的有效字节数 165 int r = file.Read(vs, 0, vs.Length); 166 List<byte> list = new List<byte>(); 167 list.Add(1); 168 list.AddRange(vs); 169 byte[] vs1 = list.ToArray(); 170 171 //获得用户选择的IP地址 172 //cboUsers:下拉菜单 173 string ip = cboUsers.Items.ToString(); 174 //发送 175 //用于存储IP地址和负责跟客户端通信的Socket;再开头定义的 176 //Send:将数据发送到连接的 socket 177 dicSocket[ip].Send(vs1); 178 } 179 } 180 181 /// <summary> 182 /// 发震动 183 /// </summary> 184 /// <param name="sender"></param> 185 /// <param name="e"></param> 186 private void BtnZD_Click(object sender, EventArgs e) 187 { 188 byte[] vs = new byte[1]; 189 vs[0] = 2; 190 //获得用户选择的IP地址 191 //cboUsers:下拉菜单 192 string ip = cboUsers.SelectedItem.ToString(); 193 dicSocket[ip].Send(vs); 194 } 195 } 196 }_Server_服务端_窗体_
1 namespace _Client_客户端_窗体_ 2 { 3 public partial class Form1 : Form 4 { 5 public Form1() 6 { 7 InitializeComponent(); 8 } 9 Socket socket; 10 private void BtnStart_Click(object sender, EventArgs e) 11 { 12 try 13 { 14 //在客户端创建一个负责跟服务端通信 使用的 Socket 15 socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 16 //获得要连接的服务器的IP地址 17 IPAddress iP = IPAddress.Parse(txtServer.Text);//txtServer:文本框 ——>TextBox 18 //获得要连接的服务器的端口号 19 IPEndPoint iPEnd = new IPEndPoint(iP, int.Parse(txtPort.Text));//txtPort:文本框 ——>TextBox 20 //客户端负责通信的Socket去连接服务端的IP地址和端口号 21 socket.Connect(iPEnd); 22 ShowMsg("连接成功"); 23 24 //设置线程来负责 25 Thread th = new Thread(Rec) 26 { 27 IsBackground = true 28 }; 29 th.Start(); 30 } 31 catch 32 { 33 34 } 35 } 36 /// <summary> 37 /// 38 /// </summary> 39 void Rec() 40 { 41 while (true) 42 { 43 try 44 { 45 //客户端接受服务端发来的消息 46 byte[] vs = new byte[1024 * 1024 * 2]; 47 //接受到的有效的字节数 48 int r = socket.Receive(vs); 49 byte b = vs[0]; 50 //发送文本消息 51 if (b == 0) 52 { 53 string str = Encoding.UTF8.GetString(vs, 1, r - 1); 54 txtLog.AppendText(str); 55 } 56 //发送文件消息 57 else if (b == 1) 58 { 59 //SaveFileDialog:提示用户选择保存文件的位置 60 SaveFileDialog sfd = new SaveFileDialog(); 61 sfd.InitialDirectory = @"C:\Users\顾守\OneDrive\桌面"; 62 sfd.Filter = "文本文件|*.txt|图片文件|*.jpg|音乐文件|*.mp3|所有文件|*.*"; 63 sfd.Title = "请选择保存路径"; 64 sfd.ShowDialog(); 65 string str = sfd.FileName; 66 using (FileStream file = new FileStream(str, FileMode.OpenOrCreate, FileAccess.ReadWrite)) 67 { 68 file.Write(vs, 1, r - 1); 69 } 70 MessageBox.Show("保存成功"); 71 } 72 //发震动 73 else if (b == 2) 74 { 75 ZD(); 76 } 77 } 78 catch 79 { 80 } 81 } 82 } 83 /// <summary> 84 /// 让窗体震动 85 /// </summary> 86 void ZD() 87 { 88 for (int i = 0; i < 200; i++) 89 { 90 //Location:获取或设置以屏幕坐标表示的代表 System.Windows.Forms.Form 左上角的 System.Drawing.Point 91 //Point:新实例初始化 System.Drawing.Point 类的指定坐标 92 this.Location = new Point(200, 200); 93 this.Location = new Point(500, 500); 94 } 95 96 } 97 98 99 void ShowMsg(string str) 100 { 101 txtLog.AppendText(str + "\r\n");//txtLog:文本框 ——>TextBox 102 } 103 104 /// <summary> 105 /// 向服务端发消息 106 /// </summary> 107 /// <param name="sender"></param> 108 /// <param name="e"></param> 109 private void BtnSend_Click(object sender, EventArgs e) 110 { 111 string str = txtMsg.Text;//txtMsg:文本框 ——>TextBox 112 byte[] vs = Encoding.UTF8.GetBytes(str); 113 socket.Send(vs); 114 } 115 116 117 private void Form1_Load(object sender, EventArgs e) 118 { 119 //在程序加载的时候 取消跨线程的检查 120 Control.CheckForIllegalCrossThreadCalls = false;////这种方式不是好方法,有好方法,用异步委托 121 } 122 } 123 }_Client_客户端_窗体_
标签:scoket,void,通信,vs,窗体,new,byte,客户端,Socket 来源: https://www.cnblogs.com/hs1637-smy/p/15631435.html