其他分享
首页 > 其他分享> > scoket通信窗体(加强)

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