C#利用Net.Sockets制作群聊天工具,需要制作两个程序。一个放在客户端聊天用的,一个放在服务器端用来接收客户端接入信息、交换客户端信息。
服务器端:
客户端:
服务器端代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net;
namespace SocketServer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
iPAdr = IPAddress.Loopback;
}
public static Dictionary<string, Socket> clientList = null;
Socket serverSocket = null;
Boolean isListen = true;
Thread thStartListen;
IPAddress iPAdr;
IPEndPoint endPoint;
private void button3_Click(object sender, EventArgs e)
{
if (serverSocket == null)
{
try
{
isListen = true;
clientList = new Dictionary<string, Socket>();
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
endPoint = new IPEndPoint(iPAdr, 1234);//port:1234
try
{
serverSocket.Bind(endPoint);
serverSocket.Listen(100);
thStartListen = new Thread(StartListen);
thStartListen.IsBackground = true;
thStartListen.Start();
txb_message.BeginInvoke(new Action(() =>
{
txb_message.Text += "Server running success...\r\n";
}));
}
catch (Exception ex)
{
MessageBox.Show("IP Error!");
txb_message.BeginInvoke(new Action(() =>
{
txb_message.Text += "Server start failed...\r\n";
}));
if (serverSocket != null)
{
serverSocket.Close();
thStartListen.Abort();
BroadCast.PushMessage("Server has closed", "", false, clientList);
foreach (var socket in clientList.Values)
{
socket.Close();
}
clientList.Clear();
serverSocket = null;
isListen = false;
}
}
}
catch(SocketException ex)
{
MessageBox.Show(ex.ToString());
}
}
}
private void StartListen()
{
isListen = true;
Socket clientSocket = default(Socket);
while (isListen)
{
try
{
if (serverSocket == null)
{
return;
}
clientSocket = serverSocket.Accept();
}
catch(SocketException ex)
{
throw ex;
}
Byte[] bytesFrom = new Byte[4096];
string dataFromClient = null;
if (clientSocket != null && clientSocket.Connected)
{
try
{
Int32 len = clientSocket.Receive(bytesFrom);
if (len > 1)
{
string tmp = Encoding.UTF8.GetString(bytesFrom, 0, len);
dataFromClient = tmp;
Int32 sublen = dataFromClient.LastIndexOf("$");
if (sublen > -1)
{
dataFromClient = dataFromClient.Substring(0, sublen);
if (!clientList.ContainsKey(dataFromClient))
{
clientList.Add(dataFromClient, clientSocket);
HandleClient client = new HandleClient(txb_message);
client.StartClient(clientSocket, dataFromClient, clientList);
txb_message.BeginInvoke(new Action(() =>
{
txb_message.Text += dataFromClient + "连接上了服务器\r" + DateTime.Now + "\r\n";
}));
}
else
{
clientList.Remove(dataFromClient);