Socket基础通信程序,以及碰到的问题记录
程序员文章站
2022-03-02 15:31:07
...
实现基础的Socket通信,自己琢磨了一晚上,发现套接字还是蛮好玩的,做出了这个基础通讯程序,碰到了诸如套接字没有连接并且没有提供地址这种问题,仔细琢磨下才发现,原来是我使用Send发送消息的时候使用的是初始化时候使用的Socket对象,以至于send就找不到地址。当客户端连接上服务器的时候,原本等待的 Socket.Accept() 会得到响应,这时候就会得到新的Socket对象,这就是客户端的Socket对象了,再使用这个客户端的Socket对象的时候就可以往客户端发送消息了。
看看MSDN关于Socket.Accept()注释:public System.Net.Sockets.Socket Accept () 他是返回新建立的Socket对象的,如果开发多人聊天程序的话感觉可以从这个部分下手。
来看看代码
1.首先建立服务端Socket,并添加配置。
//载入事件
private void Frm_SocketCommunication_Load(object sender, EventArgs e)
{
IPAddress ipD = IPAddress.Parse(host);
IPEndPoint ipE = new IPEndPoint(ipD, port);
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(ipE);
sock.Listen(10);
this.txt_Mesge.Text += "等待连接\r\n";
Thread thread = new Thread(AcceptCallBack);
thread.IsBackground = true;
thread.Start(); //启动Socket监听线程,等待客户端连接
}
//等待客户端连接
private void AcceptCallBack()
{
while (true)
{
Socket newSoc = sock.Accept();
this.Invoke(new Action(() =>
{
this.txt_Mesge.Text += $"连接已建立,客户地址:{newSoc.RemoteEndPoint}\r\n";
}));
Thread thread = new Thread(Receive);
thread.IsBackground = true;
thread.Start(newSoc);
}
}
//接受客户端的消息并处理
private void Receive(object _socket)
{
_clientSocket = (Socket)_socket;
while (true)
{
byte[] result = new byte[1024];
_clientSocket.Receive(result);
string mesge = Encoding.UTF8.GetString(result);
this.Invoke(new Action(() =>
{
this.txt_Mesge.Text += $"接收到来自客户端的消息:{mesge}:{ DateTime.Now}\r\n";
}));
}
}
2.客户端配置
//客户端全局配置
static string host = "127.0.0.1"; //注意这里的Host要和服务端的配置相同
static int port = 11000; //注意这里的Port要和服务端的配置相同
static Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//载入事件
private void FrmServer_Load(object sender, EventArgs e)
{
IPAddress Ip = IPAddress.Parse(host);
IPEndPoint Ipe = new IPEndPoint(Ip, port);
soc.Connect(Ipe); //连接服务端
Thread thread = new Thread(new ThreadStart(Receive));
thread.IsBackground = true;
thread.Start();
}
//等待服务端发送消息
private void Receive()
{
while (true)
{
byte[] receive = new byte[64];
soc.Receive(receive, receive.Length, 0);
string strInfo = Encoding.Default.GetString(receive);
this.Invoke(new Action<string>((obj) =>
{
txt_Mesge.AppendText(obj + "\r\n");
if (!soc.Connected)
{
txt_Mesge.AppendText("连接已断开\r\n");
}
}), new object[] { strInfo });
}
}
//向服务端发送信息
private void btn_Mesge_Click(object sender, EventArgs e)
{
Byte[] sendByte = new byte[2048];
string sendStr = this.txt_SendMesge.Text;
sendByte = Encoding.UTF8.GetBytes(sendStr);
soc.Send(sendByte, sendByte.Length, 0);
txt_Mesge.AppendText(sendStr + "\r\n"); //向服务端发送消息
}