服务器代码:
class Program
{
private static byte[]message=new byte[1024];
private static Socket serverSocket;
private static Int32 iPort = 8888; private static List<User> userList = new List<User>(); static void Main(string[] args)
{
IPAddress ip = IPAddress.Any;
serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(ip, iPort));
serverSocket.Listen(Int32.MaxValue);
Console.WriteLine("启动监听{0}成功",serverSocket.LocalEndPoint.ToString()); Thread acceptThread = new Thread(AcceptConnect);
acceptThread.Start();
} public static void AcceptConnect()
{
Socket newClient = null;
while (true)
{
newClient = serverSocket.Accept();
User user = new User(newClient); Thread threadReceive = new Thread(ReceiveMessage);
threadReceive.Start(user); userList.Add(user);
}
} public static void ReceiveMessage(object userState)
{
User user = (User)userState; while (true)
{
Int32 receiveNum = user.client_socket.Receive(message); String receiveString = null;
receiveString = Encoding.ASCII.GetString(message, 0, receiveNum); String[] splitString = receiveString.Split(',');
Console.WriteLine("接收客户端{0}消息{1}", user.UserName, receiveString); switch (splitString[0].ToLower())
{
case "login":
{
user.UserName = splitString[1];
Console.WriteLine("新连接{0}进入...", user.UserName);
SendMessageToAllClient(user, receiveString);
} break;
case "logout":
{
SendMessageToAllClient(user, receiveString);
userList.Remove(user);
} break;
default:
{
for (Int32 i = 0; i < userList.Count; i++)
{
if (userList[i].UserName == splitString[0])
{
SendToClient(userList[i], splitString[1]); }
}
} break;
}
}
} public static void SendMessageToAllClient(User user,String message)
{
if (message.Split(',')[0].ToLower() == "login")
{
for (Int32 i = 0; i < userList.Count; i++)
{
SendToClient(user, "login," + userList[i].UserName); } for (Int32 i = 0; i < userList.Count; i++)
{
if (userList[i].UserName != user.UserName)
{
SendToClient(userList[i], "login," + user.UserName);
}
}
}
else if (message.Split(',')[0].ToLower() == "logout")
{
for (Int32 i = 0; i < userList.Count; i++)
{
if (userList[i].UserName != user.UserName)
{
SendToClient(userList[i], "logout," + user.UserName);
} }
}
} public static void SendToClient(User user, String message)
{
user.client_socket.Send(Encoding.ASCII.GetBytes(message));
}
}客户端代码:
public partial class Form1 : Form
{ private static Socket clientSocket;
private static Int32 iPort = 8888;
private static byte[]message=new byte[1024]; public Form1()
{
InitializeComponent();
Random rd = new Random((Int32)DateTime.Now.Ticks);
TB_USERNAME.Text = rd.Next(1, 1000).ToString();
} private void B_SEND_Click(object sender, EventArgs e)
{
clientSocket.Send(Encoding.ASCII.GetBytes(TB_USERNAME.Text +","+ TB_CHAT.Text));
} private void B_LOGIN_Click(object sender, EventArgs e)
{
B_LOGIN.Enabled = false;
try
{
IPAddress ip = IPAddress.Parse("127.0.0.1");
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(ip, iPort); clientSocket.Send(Encoding.ASCII.GetBytes("Login,"+ TB_USERNAME.Text)); LB_CHAT_INFO.Items.Add("连接成功...."); Thread receiveThread = new Thread(new ThreadStart(ReceiveMessage));
receiveThread.IsBackground = true;
receiveThread.Start(); }
catch (System.Exception ex)
{
LB_CHAT_INFO.Items.Add("连接失败....");
B_LOGIN.Enabled = true;
}
} public void ReceiveMessage()
{
while (true)
{
Int32 receiveNum = clientSocket.Receive(message);
String receiveString = Encoding.ASCII.GetString(message);
string[] splitString = receiveString.Split(','); switch (splitString[0])
{
case "login":
{
AddUser(splitString[1]); } break;
case "logout":
{
RemoveUser(splitString[1]);
} break;
default:
{
AddChat(receiveString);
} break;
}
}
}
private delegate void AddChatDelegate(String message); public void AddChat(String message)
{
if (LB_CHAT_INFO.InvokeRequired)
{
AddChatDelegate d = AddChat;
LB_CHAT_INFO.Invoke(d, message);
}
else
{
LB_CHAT_INFO.Items.Add(message);
} } private delegate void AddUserDelegate(String name); public void AddUser(String name)
{
if (LB_USER_ONLINE.InvokeRequired)
{
AddUserDelegate d = AddUser;
LB_USER_ONLINE.Invoke(d,name);
}
else
{
LB_USER_ONLINE.Items.Add(name);
}
} private delegate void RemoveUserDelegate(String name); public void RemoveUser(String name)
{
if (LB_USER_ONLINE.InvokeRequired)
{
AddUserDelegate d = RemoveUser;
LB_USER_ONLINE.Invoke(d, name);
}
else
{
LB_USER_ONLINE.Items.Remove(name);
} }
}为什么后面连接进入的User,看不到前面的User
class Program
{
private static byte[]message=new byte[1024];
private static Socket serverSocket;
private static Int32 iPort = 8888; private static List<User> userList = new List<User>(); static void Main(string[] args)
{
IPAddress ip = IPAddress.Any;
serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(ip, iPort));
serverSocket.Listen(Int32.MaxValue);
Console.WriteLine("启动监听{0}成功",serverSocket.LocalEndPoint.ToString()); Thread acceptThread = new Thread(AcceptConnect);
acceptThread.Start();
} public static void AcceptConnect()
{
Socket newClient = null;
while (true)
{
newClient = serverSocket.Accept();
User user = new User(newClient); Thread threadReceive = new Thread(ReceiveMessage);
threadReceive.Start(user); userList.Add(user);
}
} public static void ReceiveMessage(object userState)
{
User user = (User)userState; while (true)
{
Int32 receiveNum = user.client_socket.Receive(message); String receiveString = null;
receiveString = Encoding.ASCII.GetString(message, 0, receiveNum); String[] splitString = receiveString.Split(',');
Console.WriteLine("接收客户端{0}消息{1}", user.UserName, receiveString); switch (splitString[0].ToLower())
{
case "login":
{
user.UserName = splitString[1];
Console.WriteLine("新连接{0}进入...", user.UserName);
SendMessageToAllClient(user, receiveString);
} break;
case "logout":
{
SendMessageToAllClient(user, receiveString);
userList.Remove(user);
} break;
default:
{
for (Int32 i = 0; i < userList.Count; i++)
{
if (userList[i].UserName == splitString[0])
{
SendToClient(userList[i], splitString[1]); }
}
} break;
}
}
} public static void SendMessageToAllClient(User user,String message)
{
if (message.Split(',')[0].ToLower() == "login")
{
for (Int32 i = 0; i < userList.Count; i++)
{
SendToClient(user, "login," + userList[i].UserName); } for (Int32 i = 0; i < userList.Count; i++)
{
if (userList[i].UserName != user.UserName)
{
SendToClient(userList[i], "login," + user.UserName);
}
}
}
else if (message.Split(',')[0].ToLower() == "logout")
{
for (Int32 i = 0; i < userList.Count; i++)
{
if (userList[i].UserName != user.UserName)
{
SendToClient(userList[i], "logout," + user.UserName);
} }
}
} public static void SendToClient(User user, String message)
{
user.client_socket.Send(Encoding.ASCII.GetBytes(message));
}
}客户端代码:
public partial class Form1 : Form
{ private static Socket clientSocket;
private static Int32 iPort = 8888;
private static byte[]message=new byte[1024]; public Form1()
{
InitializeComponent();
Random rd = new Random((Int32)DateTime.Now.Ticks);
TB_USERNAME.Text = rd.Next(1, 1000).ToString();
} private void B_SEND_Click(object sender, EventArgs e)
{
clientSocket.Send(Encoding.ASCII.GetBytes(TB_USERNAME.Text +","+ TB_CHAT.Text));
} private void B_LOGIN_Click(object sender, EventArgs e)
{
B_LOGIN.Enabled = false;
try
{
IPAddress ip = IPAddress.Parse("127.0.0.1");
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(ip, iPort); clientSocket.Send(Encoding.ASCII.GetBytes("Login,"+ TB_USERNAME.Text)); LB_CHAT_INFO.Items.Add("连接成功...."); Thread receiveThread = new Thread(new ThreadStart(ReceiveMessage));
receiveThread.IsBackground = true;
receiveThread.Start(); }
catch (System.Exception ex)
{
LB_CHAT_INFO.Items.Add("连接失败....");
B_LOGIN.Enabled = true;
}
} public void ReceiveMessage()
{
while (true)
{
Int32 receiveNum = clientSocket.Receive(message);
String receiveString = Encoding.ASCII.GetString(message);
string[] splitString = receiveString.Split(','); switch (splitString[0])
{
case "login":
{
AddUser(splitString[1]); } break;
case "logout":
{
RemoveUser(splitString[1]);
} break;
default:
{
AddChat(receiveString);
} break;
}
}
}
private delegate void AddChatDelegate(String message); public void AddChat(String message)
{
if (LB_CHAT_INFO.InvokeRequired)
{
AddChatDelegate d = AddChat;
LB_CHAT_INFO.Invoke(d, message);
}
else
{
LB_CHAT_INFO.Items.Add(message);
} } private delegate void AddUserDelegate(String name); public void AddUser(String name)
{
if (LB_USER_ONLINE.InvokeRequired)
{
AddUserDelegate d = AddUser;
LB_USER_ONLINE.Invoke(d,name);
}
else
{
LB_USER_ONLINE.Items.Add(name);
}
} private delegate void RemoveUserDelegate(String name); public void RemoveUser(String name)
{
if (LB_USER_ONLINE.InvokeRequired)
{
AddUserDelegate d = RemoveUser;
LB_USER_ONLINE.Invoke(d, name);
}
else
{
LB_USER_ONLINE.Items.Remove(name);
} }
}为什么后面连接进入的User,看不到前面的User
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货