客户端:
Socket sock = null;
byte[] buffer = new byte[1024];
private void btnStart_Click(object sender, EventArgs e)
{
try
{
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(txtServer.Text);
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
//获得要连接的远程服务器应用程序的IP地址和端口号
//sock.BeginConnect(point, new AsyncCallback(ConnectServer), sock);
//铜鼓
sock.Connect(point);
ShowTxtLog("连接成功");
sock.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(CallReveive), sock);
btnStart.Enabled = false;
}
catch
{
Action ac = () => { btnStart.Enabled = true; };
}
}
private void ConnectServer(IAsyncResult Iay)
{
Socket sock = Iay.AsyncState as Socket;
if (sock != null)
{
sock.EndConnect(Iay);
}
}
private void CallReveive(IAsyncResult Iay)
{
try
{
Socket sock = Iay.AsyncState as Socket;
if (sock != null && IsSocketConnected(sock))
{
int len = sock.EndReceive(Iay);
string s = Encoding.Default.GetString(buffer, 0, len);
ShowTxtLog(s);
}
if (sock != null && IsSocketConnected(sock))
{
sock.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(CallReveive), sock);
}
}
catch (Exception e) { Action ac = () => { btnStart.Enabled = true; }; }
}
public bool IsSocketConnected(Socket s)
{
if (s == null)
return false;
return !((s.Poll(1000, SelectMode.SelectRead) && (s.Available == 0)) || !s.Connected);
}
private void ShowTxtLog(string s)
{
Action ac = () => {
txtLog.AppendText(s+"\r\n");
};
Invoke(ac);
}
private void btnSend_Click(object sender, EventArgs e)
{
if (sock != null && IsSocketConnected(sock))
{
byte[] data = Encoding.Default.GetBytes(txtMsg.Text);
sock.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(CallBackSend), sock);
}
}
private void CallBackSend(IAsyncResult Iay)
{
Socket sock = Iay.AsyncState as Socket;
if (sock != null)
{
int len= sock.EndSend(Iay);
ShowTxtLog("客户端发送"+len +"个字节");
}
}
服务端:
//服务端buffer为4字节
static byte[] buffer = new byte[1024];
private void button1_Click(object sender, EventArgs e)
{
try
{
Socket socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketServer.Bind(new IPEndPoint(IPAddress.Parse(textBox1.Text ), Convert.ToInt32(textBox2.Text)));
socketServer.Listen(int.MaxValue);
ShowText3("服务端已启动,等待连接...");
//接收连接
//Socket ts = socketServer.Accept();
socketServer.BeginAccept(new AsyncCallback(ClientAccepted), socketServer);
//ShowText3("客户端已连接");
//开始异步接收
//ts.BeginServer(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), ts);
button1.Enabled = false;
}
catch (Exception ex)
{
Action ac = () => { button1.Enabled = true; };
Console.WriteLine(ex.Message);
}
}
Socket socketsend = null;
public void ClientAccepted(IAsyncResult ar)
{
var socket = ar.AsyncState as Socket;
//客户端Socket实例,后续保存
if (socket != null)
{
socketsend = socket.EndAccept(ar);
//客户端IP地址和端口信息
//IPEndPoint colientip = (IPEndPoint)client.RemoteEndPoint;
//Console.WriteLine(colientip + "客户已连接", ConsoleColor.Yellow);
ShowText3("客户已连接");
//接受客户端消息
socketsend.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMsg), socketsend);
//socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
}
//准备接受下一个客户端连接请求
if (socket != null) socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
}
//接受客户端的消息
public void ReceiveMsg(IAsyncResult ar)
{
Socket socket = ar.AsyncState as Socket;
//客户端IP地址和端口消息
if (socket != null )
{
try
{
var length = socket.EndReceive(ar);
var message = Encoding.UTF8.GetString(buffer, 0, length);
//Console.WriteLine(clientipe + ":" + message, ConsoleColor.White);
ShowText3(message);
//socket.Send(Encoding.UTF8.GetBytes("服务器收到消息"));
}
catch (Exception)
{
Action ac = () => { button1.Enabled = true; };
//count--;
//Console.WriteLine(clientipe + "断开连接" + (count), ConsoleColor.Red);
}
}
if (socket != null && IsSocketConnected(socket))
{
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMsg), socket);
}
}
/// 另一种判断connected的方法,但未检测对端网线断开或ungraceful的情况
public bool IsSocketConnected(Socket s)
{
#region 过程
if (s == null)
return false;
return !((s.Poll(1000, SelectMode.SelectRead) && (s.Available == 0)) || !s.Connected);
#endregion
}
void ReceiveCallback(IAsyncResult result)
{
Socket ts = (Socket)result.AsyncState;
ts.EndReceive(result);
result.AsyncWaitHandle.Close();
ShowText3(string.Format("收到消息:{0}", Encoding.ASCII.GetString(buffer)));
//清空数据,重新开始异步接收
buffer = new byte[buffer.Length];
ts.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), ts);
}
private void ShowText3(string s)
{
Action ac = () => {
textBox3.AppendText(s +"\r\n");
};
Invoke(ac);
}
private void ShowText4(string s)
{
Action ac = () =>
{
textBox4.AppendText(s + "\r\n");
};
Invoke(ac);
}
private void button2_Click(object sender, EventArgs e)
{
if (socketsend != null && IsSocketConnected(socketsend))
{
//同步
//socket.Send(Encoding.Default.GetBytes(textBox4.Text));
//异步
byte[] byteData = Encoding.Default.GetBytes(textBox4.Text);
socketsend.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), socketsend);
}
}
public void SendCallback(IAsyncResult Iay)
{
Socket handler = (Socket)Iay.AsyncState;
// Complete sending the data to the remote device.
int bytesSent= handler.EndSend(Iay);
ShowText3(string.Format("发送了 {0} 字节到客户端.", bytesSent));
//handler.Shutdown(SocketShutdown.Both);
//handler.Close();
}
下载地址:Sock异步通信(客户端和服务端).zip-C#代码类资源-CSDN下载