C#编写一个客户端与服务器端的通讯样例
构建Server窗体以及所需函数
窗体结构如下:
定义一个服务端的server代码如下:
private void MySocket()
{
//1.创建一个用于监听连接的Socket对象;
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
//2.用指定的端口号和服务器的Ip建立一个EndPoint对象;
IPAddress iP = IPAddress.Parse(textBox1.Text);
IPEndPoint endPoint = new IPEndPoint(iP, int.Parse(textBox2.Text));
//3.用Socket对象的Bind()方法绑定EndPoint;
server.Bind(endPoint);
//4.用Socket对象的Listen()方法开始监听;
//同一时刻内允许同时加入链接的最大数量
server.Listen(10);
listBox1.Items.Add("服务器已经成功开启!");
//5.接收到客户端的连接,用Socket对象的Accept()方法创建一个新的用于和客户端进行通信的Socket对象;
while (true)
{
//接受接入的一个客户端
Socket connectClient = server.Accept();
if (connectClient != null)
{
string infor = connectClient.RemoteEndPoint.ToString();
clientList.Add(infor, connectClient);
listBox1.Items.Add(infor + "加入服务器!");
///服务器将消息发送至客服端
string msg = infor + "已成功进入到聊天室!";
comboBox1.Items.Add(infor);
//SendMsg(msg);
//SendMsg("HELLO");
//每有一个客户端接入时,需要有一个线程进行服务
Thread threadClient = new Thread(ReciveMsg);//带参的方法可以把传递的参数放到start中
threadClient.IsBackground = true;
//创建的新的对应的Socket和客户端Socket进行通信
threadClient.Start(connectClient);
}
}
接收函数定义代码如下:
private void ReciveMsg(object o)
{
//Socket connectClient = (Socket)o; //与下面效果一样
Socket connectClient = o as Socket;//connectClient负责客户端的通信
IPEndPoint endPoint = null;
while (true)
{
try
{
///定义服务器接收的字节大小
byte[] arrMsg = new byte[1024 * 1024];
///接收到的信息大小(所占字节数)
int length = connectClient.Receive(arrMsg);
if (length > 0)
{
string recMsg = Encoding.UTF8.GetString(arrMsg, 0, length);
if (recMsg.Contains("HELLO"))
{
SendMsg("HELLO");
}
/*else if (recMsg.Contains("SCN1"))
{
SendMsg("INFO");
}
else if (recMsg.Contains("RADIOTST_1001_L2VISION___1EQ_1READY_2OFFLINE"))
{
SendMsg("REQ1");
}
else if (recMsg.Contains("DUT1_TEST_NG___EQ1_LOAD_READY"))
{
SendMsg("CTL1_START");
}*/
//获取客户端的端口号
endPoint = connectClient.RemoteEndPoint as IPEndPoint;
listBox1.Items.Add(DateTime.Now + "[" + endPoint.Port.ToString() + "]:" + recMsg);
}
}
catch (Exception)
{
///移除添加在字典中的服务器和客户端之间的线程
clientList.Remove(endPoint.ToString());
connectClient.Dispose();
}
}
}
服务端发送指令到客户端的函数如下:
private void SendMsg(string str)
{
str = str + "\r" + "\n";
Socket ca ;
///根据下拉框选择的客户端来给对应的客户端发送指令
clientList.TryGetValue(comboBox1.Text,out ca);
byte[] arrMsg = Encoding.UTF8.GetBytes(str);
///获取键值(服务器),发送消息
ca.Send(arrMsg);
}
构建Client端窗体以及代码
窗体结构如下:
客户端代码与服务端相似,代码如下:
private void button1_Click(object sender, EventArgs e)
{
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
IPAddress ip = IPAddress.Parse(textBox1.Text);
IPEndPoint endPoint = new IPEndPoint(ip, int.Parse(textBox2.Text));
try
{
client.Connect(endPoint);
}
catch (Exception)
{
MessageBox.Show("地址或端口错误!!!!");
return;
}
Thread thread = new Thread(ReciveMsg);
thread.IsBackground = true;
thread.Start(client);
}
private void ReciveMsg(object o)
{
while (true)
{
try
{
///定义客户端接收到的信息大小
byte[] arrList = new byte[1024 * 1024];
///接收到的信息大小(所占字节数)
int length = client.Receive(arrList);
string msg = DateTime.Now + Encoding.UTF8.GetString(arrList, 0, length);
listBox1.Items.Add(msg);
}
catch (Exception)
{
///关闭客户端
client.Close();
}
}
}
private void button2_Click(object sender, EventArgs e)
{
if (richTextBox1.Text != "")
{
SendMsg(richTextBox1.Text);
}
}
private void SendMsg(string str)
{
byte[] arrMsg = Encoding.UTF8.GetBytes(str);
client.Send(arrMsg);
}
运行结果
服务器端开启服务
客户端连接服务端,然后发送"HELLO"指令
服务器端接收到已经连接的信息和"HELLO"指令
源代码路径如下:
链接: link.