Socket
Server
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace DotnetSocketServer
{
/// <summary>
/// 基于.netcore的SocketServer
/// </summary>
public partial class DotnetSocketServer : Form
{
public DotnetSocketServer()
{
InitializeComponent();
}
//存储已连接的客户端的泛型集合
private static Dictionary<string, Socket> socketList = new Dictionary<string, Socket>();
/// <summary>
/// 接收连接
/// </summary>
/// <param name="obj"></param>
public void StartServer(object obj)
{
string str;
while (true)
{
//等待接收客户端连接 Accept方法返回一个用于和该客户端通信的Socket
Socket recviceSocket = ((Socket)obj).Accept();
//获取客户端ip和端口号
str = recviceSocket.RemoteEndPoint.ToString();
socketList.Add(str, recviceSocket);
//控件调用invoke方法 解决"从不是创建控件的线程访问它"的异常
cmb_socketlist.Invoke(new Action(() => { cmb_socketlist.Items.Add(str); }));
SetMessage(str + "已连接");
//Accept()执行过后 当前线程会阻塞 只有在有客户端连接时才会继续执行
//创建新线程,监控接收新客户端的请求数据
Thread thread = new Thread(startRecive);
thread.IsBackground = true;
thread.Start(recviceSocket);
}
}
/// <summary>
/// 接收消息
/// </summary>
/// <param name="obj">客户端socket</param>
public void startRecive(object obj)
{
string str;
string ip;
while (true)
{
byte[] buffer = new byte[2048];
int count;
try
{
//Receive(Byte[]) 从绑定的 Socket 套接字接收数据,将数据存入接收缓冲区。
//该方法执行过后同Accept()方法一样 当前线程会阻塞 等到客户端下一次发来数据时继续执行
count = ((Socket)obj).Receive(buffer);
ip = ((Socket)obj).RemoteEndPoint.ToString();
if (count == 0)
{
cmb_socketlist.Invoke(new Action(() => { cmb_socketlist.Items.Remove(ip); }));
SetMessage(ip + "已断开连接");
break;
}
else
{
str = Encoding.Default.GetString(buffer, 0, count);
SetMessage("收到" + ip + "数据 " + str);
}
}
catch (Exception)
{
}
}
}
/// <summary>
/// 开启服务器监听
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_StartListen_Click(object sender, EventArgs e)
{
//实例化一个Socket对象,确定网络类型、Socket类型、协议类型
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint IEP = new IPEndPoint(IPAddress.Parse(txt_ip.Text), int.Parse(txt_port.Text));
//绑定ip和端口
socket.Bind(IEP);
//开启监听
socket.Listen(10);
SetMessage("开始监听");
Thread thread = new Thread(new ParameterizedThreadStart(StartServer));
thread.IsBackground = true;
thread.Start(socket);
}
/// <summary>
/// 向对应客户端发送数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_send_Click(object sender, EventArgs e)
{
string str = txt_send.Text;
byte[] bytes = new byte[2048];
bytes = Encoding.Default.GetBytes(str);
//获取combobox的值 从泛型集合中获取对应的客户端socket 然后发送数据
if (cmb_socketlist.Items.Count != 0)
{
if (cmb_socketlist.SelectedItem == null)
{
MessageBox.Show("请选择一个客户端发送数据!");
return;
}
else
{
socketList[cmb_socketlist.SelectedItem.ToString()].Send(bytes);
SetMessage("发送到客户端"+ cmb_socketlist.SelectedItem.ToString() + "数据: "+ str);
}
}
else
{
SetMessage("当前无连接的客户端");
}
txt_send.Clear();
}
private void DotnetSocketServer_FormClosed(object sender, FormClosedEventArgs e)
{
System.Environment.Exit(0);
}
/// <summary>
/// 添加信息
/// </summary>
/// <param name="msg"></param>
private void SetMessage(string msg)
{
richTextBox1.Invoke(new Action(() => { richTextBox1.AppendText(msg + "\r\n"); }));
}
}
}
Client
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 test1
{
/// <summary>
/// 基于.netframework的SocketClient
/// </summary>
public partial class DotnetFrameworkSocketClient : Form
{
public DotnetFrameworkSocketClient()
{
InitializeComponent();
}
byte[] buffer = new byte[2048];
Socket socket;
Thread thread;
/// <summary>
/// 连接服务器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_start_Click(object sender, EventArgs e)
{
try
{
//实例化socket
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接服务器
socket.Connect(new IPEndPoint(IPAddress.Parse(txt_ip.Text), int.Parse(txt_port.Text)));
thread = new Thread(StartReceive);
thread.IsBackground = true;
thread.Start(socket);
SetMessage("打开与远程服务器的连接!");
}
catch (Exception ex)
{
SetMessage("服务器异常:" + ex.Message);
}
}
/// <summary>
/// 开启接收
/// </summary>
/// <param name="obj"></param>
private void StartReceive(object obj)
{
string str;
while (true)
{
Socket receiveSocket = obj as Socket;
try
{
if (receiveSocket.Connected == false) continue;
int result = receiveSocket.Receive(buffer);
if (result == 0)
{
break;
}
else
{
str = Encoding.Default.GetString(buffer, 0, result);
SetMessage("接收到服务器数据: " + str);
}
}
catch (Exception ex)
{
SetMessage("服务器异常:" + ex.Message);
}
}
}
/// <summary>
/// 关闭连接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_close_Click(object sender, EventArgs e)
{
try
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
thread.Abort();
thread = null;
SetMessage("关闭与远程服务器的连接!");
}
catch (Exception ex)
{
SetMessage("异常" + ex.Message);
}
}
private void button1_Click(object sender, EventArgs e)
{
socket.Send(Encoding.Default.GetBytes(txt_send.Text));
SetMessage("发送到服务器数据: " + txt_send.Text);
txt_send.Clear();
}
/// <summary>
/// 添加信息
/// </summary>
/// <param name="msg"></param>
private void SetMessage(string msg)
{
richTextBox1.Invoke(new Action(() => { richTextBox1.AppendText(msg + "\r\n"); }));
}
}
}
浙公网安备 33010602011771号