代码贴出来
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Threading;
using System.IO;
namespace server2
{
public partial class serverMain : Form
{
private NetworkStream nsStream;
private IPAddress ip;
private int port;
private TcpListener server;
Thread acceptThread;
Thread threadCommunicate;
private List clients = new List();
Dictionary dict = new Dictionary();
public serverMain()
{
InitializeComponent();
ChatContent.AppendText("欢迎\n");
ip = IPAddress.Parse(IP2.Text);
port = Convert.ToInt32(port_tb.Text.Trim());
}
private void connect(object sender, EventArgs e)//开启服务器
{
stop_btn.Enabled = true;
server = new TcpListener(ip, port);
server.Start();//开始侦听
ChatContent.Text = ChatContent.Text.Insert(0, "开始侦听\n");
start_btn.Enabled = false;
Thread ListenClient = new Thread(RecClient);
ListenClient.Start();
}
void RecClient()
{
while (true)
{
TcpClient client = new TcpClient();
try
{
client = server.AcceptTcpClient();
clients.Add(client);
}
catch (Exception ex)
{
MessageBox.Show("服务端连接时发生异常:" + ex.Message);
break;
}
//当有新的socket连接到服务端时就将IP添加到在线列表中,作为客户端的唯一标识
client_list.BeginInvoke(new Action(() => { client_list.Items.Add(client.Client.RemoteEndPoint.ToString());}));
//将每个新产生的套接字存起来,装到键值对Dict集合中,以客户端IP:端口作为key
dict.Add(client.Client.RemoteEndPoint.ToString(), client);
//为每个服务端通信套接字创建一个单独的通信线程,负责调用通信套接字方法,监听客户端发来的数据
//创建通信线程
threadCommunicate = new Thread(acceptClientConnect);
threadCommunicate.Start(client);//有传入参数的线程
}
}
private void acceptClientConnect(object client)//接收信息
{
string msgUsers = "LIST";
string ipstr = null;
try
{
TcpClient tcpClient = (TcpClient)client;
nsStream = tcpClient.GetStream();
//byte[] ppp = new byte[100000];
//tcpClient.Client.Receive(ppp);
string str = Convert.ToString(tcpClient.Client.RemoteEndPoint);//发消息的客户端的信息
ChatContent.BeginInvoke(new Action(() => { ChatContent.Text = ChatContent.Text.Insert(0, str + ":已连接\n"); }));
//listlist();
msgUsers = "LIST";
foreach (TcpClient p in clients)
{
ipstr = Convert.ToString(p.Client.RemoteEndPoint);//所有客户端信息
msgUsers = msgUsers + "|" + ipstr;
}
foreach (TcpClient p in clients)
{
nsStream = p.GetStream();
Byte[] bytes = System.Text.Encoding.Default.GetBytes(msgUsers.ToCharArray());
nsStream.Write(bytes, 0, bytes.Length);//发送所有客户端信息到连接的客户端
}
while (true)
{
try
{
byte[] buff = new byte[4096];
int len;
string msg;// msg1 = Convert.ToString(client_list.Text);
len = nsStream.Read(buff, 0, buff.Length);
msg = System.Text.Encoding.Default.GetString(buff, 0, len);
string[] accept = msg.Split(new char[] { '|' });
if (accept[0] == "msg")//发送到服务器
ChatContent.BeginInvoke(new Action(() => { ChatContent.Text = ChatContent.Text.Insert(0, str + ":" + accept[1] + "\n"); }));
else if (accept[0] == "pmsg")//点对点发送
{
nsStream = dict[accept[1]].GetStream();
Byte[] bytes2 = System.Text.Encoding.Default.GetBytes((str+"——>我:"+accept[accept.Length - 1]).ToCharArray());
nsStream.Write(bytes2, 0, bytes2.Length);
ChatContent.BeginInvoke(new Action(() => { ChatContent.AppendText(str + "——>" + accept[1] + ":" + accept[accept.Length - 1]); }), null);//显示在服务器列表
}//发送到指定客户端
else if (accept[0] == "STOP")//断开连接
{
clients.Remove(tcpClient);
//listlist();
msgUsers = "LIST";
foreach (TcpClient p in clients)
{
ipstr = Convert.ToString(p.Client.RemoteEndPoint);//所有客户端信息
msgUsers = msgUsers + "|" + ipstr;
}
foreach (TcpClient p in clients)
{
nsStream = p.GetStream();
Byte[] bytes = System.Text.Encoding.Default.GetBytes(msgUsers.ToCharArray());
nsStream.Write(bytes, 0, bytes.Length);//发送所有客户端信息到连接的客户端
}
client_list.BeginInvoke(new Action(() =>
{
int index = client_list.Items.IndexOf(str); client_list.Items.RemoveAt(index);
}
), null);
ChatContent.BeginInvoke(new Action(() => { ChatContent.Text = ChatContent.Text.Insert(0, str + ":" + accept[1] + "\n"); }));
//tcpClient.Close();//关闭连接
return;
}
}
catch (Exception ex)
{
ChatContent.BeginInvoke(new Action(() => { ChatContent.Text = ChatContent.Text.Insert(0, "错误信息:" + ex.Message + "\n"); }), null);
break;
}
}
}
catch (Exception )
{
}
}
private void stop_btn_Click(object sender, EventArgs e)//关闭服务器
{
start_btn.Enabled = true;
stop_btn.Enabled = false;
ChatContent.Text = ChatContent.Text.Insert(0, "服务器已关闭\n");
server.Stop();
}
private void serverMain_Load(object sender, EventArgs e)
{
Info.ServerListBox = this.client_list;
}
private void stop_btn_Click_1(object sender, EventArgs e)
{
}
}
}
/* Action pAction = new Action(() => {
try
{
while (true)
{
TcpClient client;
client = server.AcceptTcpClient();
clients.Add(client);
//this.ChatContent.AppendText("用户已连接\n");
//Socket s = client.Client;
//client_ip = IPAddress.Parse(GetRemoteIP(client));
Thread listenthread = new Thread(new ParameterizedThreadStart(listenForClient));
listenthread.Start(client);
}
}
catch (Exception ex)
{
//this.ChatContent.AppendText(ex.Message+"\n");
}
});
//pAction.BeginInvoke(null, null);
}
private void listenForClient(object client)
{
TcpClient tcpClient = (TcpClient)client;
//Socket s = tcpClient.Client;
//IPAddress client_ip = IPAddress.Parse(GetRemoteIP(tcpClient));
//int port = Convert.ToInt32(GetRemotePort(tcpClient));//获取IP和端口
//ChatContent.AppendText("用户:"+client_ip+":"+port+"已连接\n");
nsStream = tcpClient.GetStream();
byte[] buff = new byte[4096];
int len;
string msg;
//Invoke(new addHandler(add), ChatContent, msg);
while (true)
{
try
{
len = nsStream.Read(buff, 0, buff.Length);
msg = System.Text.Encoding.Default.GetString(buff, 0, len);
ChatContent.AppendText(msg);
}
catch (Exception ex)
{
ChatContent.AppendText(ex.Message+"\n");
}
}*/