用c#suppersocket实现简易的服务端与客户端通讯
最终实现的效果:
项目大体结构
服务端:
设计思路:
1、创建一个监听连接的serverSocket对象
2.用指定的端口号和服务器的ip建立一个EndPoint对像;
3.将EndPoint对象绑定到serverSocket对象上
4.用serverSocket.Listen()方法开始监听
5.接收到客户端的连接,用serverSocket.Accpet方法创建一个新的socket对像用于和客户端进行通信的;
6.:通信结束后一定先关闭socket;监听线程关闭,接受信息线程关闭
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MyServer
{
public partial class Server : Form
{
//定义Socket对象
Socket serverSocket;
//定义监听线程
Thread listenThread;
//定义接受客户端数据线程
Thread threadReceive;
//定义双方通信
Socket socket;
String str;
public Server()
{
InitializeComponent();
}
//开始监听按钮
private void buttonServer_Click(object sender, EventArgs e)
{
IPAddress ip = IPAddress.Parse(this.textIp.Text.Trim());
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
//绑定IP和端口
serverSocket.Bind(new IPEndPoint(ip, Convert.ToInt32(this.textPortBox.Text.Trim())));
//设置最多10个连接请求
serverSocket.Listen(10);
//开启线程循环监听
listenThread = new Thread(ListenClientConnect);
listenThread.Start();
this.startButton.Enabled = false;
}
catch { }
}
//停止监听按钮
private void endButton_Click(object sender, EventArgs e)
{
//socket关闭
serverSocket.Close();
//线程关闭
listenThread.Abort();
threadReceive.Abort();
}
//监听
private void ListenClientConnect()
{
while (true)
{
//监听到客户端的链接,获取双方通信的socket
socket = serverSocket.Accept();
//创建线程循环接收客户端发送的请求
threadReceive = new Thread(Receive);
//传入双方通信socket
threadReceive.Start(socket);
}
}
//接收客户端数据
private void Receive(object socket)
{
try
{
Socket myClientStocket = (Socket)socket;
while (true)
{
byte[] buff = new byte[2000];
int r = myClientStocket.Receive(buff);
str = Encoding.Default.GetString(buff, 0, r);
//将客户端发送的消息显示到文本框中
this.Invoke(new Action(() => { this.richTextBoxShow.Text = str; }));
}
}
catch
{
MessageBox.Show("接收数据失败");
}
}
//发送按钮,发送数据
private void send_Click(object sender, EventArgs e)
{
try
{
string strMsg = this.richTextsend.Text.Trim();
byte[] buffer = new byte[20000];
buffer = Encoding.Default.GetBytes(strMsg);
socket.Send(buffer);
}
catch
{
MessageBox.Show("发送数据失败", "发送数据失败");
}
}
}
客户端:
1:建立一个clientSocket对像;
2:用指定的端口号和服务器的ip建立一个EndPoint对像;
3:用clientSocket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;
4:如果连接成功,就用clientSocket对像的Send()方法向服务器发送信息;
5:用clientSocket对像的Receive()方法接受服务器发来的信息 ;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MyClient
{
public partial class Client : Form
{
public Socket serverSocket { get; private set; }
//定义Socket对象
Socket clientSocket;
//创建接收消息的线程
Thread threadReceive;
//接收服务端发送的数据
string str;
public Client()
{
InitializeComponent();
}
private void buttonStart_Click(object sender, EventArgs e)
{
IPAddress ip = IPAddress.Parse(this.textBoxIp.Text.Trim());
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
//连接服务器
clientSocket.Connect(ip, Convert.ToInt32(this.textBoxPort.Text.Trim()));
//开启线程不停地接服务器发送的数据
threadReceive = new Thread(new ThreadStart(Receive));
//设置该值是否是后台线程
threadReceive.IsBackground = true;
threadReceive.Start();
this.buttonStart.Enabled = false;
}
catch
{
MessageBox.Show("连接服务端失败,请确认ip和端口是否填写正确", "连接服务端失败");
}
}
//接收客户端数据
private void Receive()
{
try
{
while (true)
{
byte[] buff = new byte[2000];
int r = clientSocket.Receive(buff);
str = Encoding.Default.GetString(buff, 0, r);
this.Invoke(new Action(() => { this.richTextShow.Text = str; }));
}
}
catch
{
MessageBox.Show("获取服务端参数失败", "获取服务端参数失败");
}
}
private void buttonEnd_Click(object sender, EventArgs e)
{
//clientSocket关闭
clientSocket.Close();
//线程关闭
threadReceive.Abort();
}
}