private void button1_Click(object sender, System.EventArgs e)
{
IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
int port = Convert.ToInt32("8080");
MyTcpListener = new TcpListener(ipAddress, port);
MyTcpListener.Start();
// while (true)//没有while循环就可以运行单个客户端的,怎样使一个服务器对应多个客户端??这样不行??
// {
try
{
Socket s = MyTcpListener.AcceptSocket();
SocketForClient = s;
listenThread = new Thread(new ThreadStart(Listen));
listenThread.Start();
}
catch (Exception ee)
{
textBox2.Text = ee.Message;
} // }
}
private void Listen()
{
if (SocketForClient.Connected)
{
textBox3.Text = "Client Connects Success !\r\n";
MyNetworkStream = new NetworkStream(SocketForClient);
MyStreamReader = new StreamReader(MyNetworkStream);
MyStreamWriter = new StreamWriter(MyNetworkStream);
recvThread = new Thread(new ThreadStart(RecvData));
recvThread.Start();
}
{
IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
int port = Convert.ToInt32("8080");
MyTcpListener = new TcpListener(ipAddress, port);
MyTcpListener.Start();
// while (true)//没有while循环就可以运行单个客户端的,怎样使一个服务器对应多个客户端??这样不行??
// {
try
{
Socket s = MyTcpListener.AcceptSocket();
SocketForClient = s;
listenThread = new Thread(new ThreadStart(Listen));
listenThread.Start();
}
catch (Exception ee)
{
textBox2.Text = ee.Message;
} // }
}
private void Listen()
{
if (SocketForClient.Connected)
{
textBox3.Text = "Client Connects Success !\r\n";
MyNetworkStream = new NetworkStream(SocketForClient);
MyStreamReader = new StreamReader(MyNetworkStream);
MyStreamWriter = new StreamWriter(MyNetworkStream);
recvThread = new Thread(new ThreadStart(RecvData));
recvThread.Start();
}
解决方案 »
- Timer[] DoWorkTimer
- 多线程同时做一件事情的各个部分,一个线程遇到问题,一起停止,如何实现?
- gdi+ 画图,如何保存直线的所有属性,比如点击直线时,弹出窗口可输入一部分属性,保存后重新打开图时,属性还在。
- datagridview_currentCellChanged代码中出现错误nullReferenceException
- 一个小问题,数组问题
- 请教treeview问题
- 请教Webclient下的DownloadFileAsync遇到的问题
- C#中如何重写CheckedListBox控件
- windows service 中调用 sqlldr,高分求
- WPF,滚动条的这个功能如何实现?
- 字符串对齐
- 图像任意角度转动,获得头坐标
我希望,能够在哪里加上while循环,创建多个Socket来运行一个服务器和多个客户端
服务器和每个客户端都能够独立的发送和接收信息,而不受其他的干扰
using System;
using System.Collections.Generic;
using System.Linq;using System.Threading;
using System.Net;
using System.Net.Sockets;
namespace ConsoleApplication20
{
class CSocket
{
List<User> userList = new List<User>();
IPAddress localAddress;
private int port = 51888;
private Socket myListener;
private Service service;
public CSocket()
{
Console.WriteLine("--------------------------------------");
service = new Service();
}
public void StartCSocket()
{
myListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress[] addrIP = Dns.GetHostAddresses(Dns.GetHostName());
localAddress = addrIP[0];
myListener.Bind(new IPEndPoint(localAddress,port));
myListener.Listen(0);
Console.WriteLine("开始监听{0}:{1}",localAddress.ToString(),port.ToString());
ThreadStart ts = new ThreadStart(ListenClientConnect);
Thread myThread = new Thread(ts);
myThread.Start();
} private void ListenClientConnect()
{
while (true)
{
Socket newClient;
try
{
newClient = myListener.Accept();
}
catch
{
break;
}
ParameterizedThreadStart pts = new ParameterizedThreadStart(ReceiveData);
Thread threadReceive = new Thread(pts);
User user = new User(newClient);
threadReceive.Start(user);
userList.Add(user);
Console.WriteLine("{0}进入",newClient.RemoteEndPoint.ToString());
Console.WriteLine("当前连接用户数:{0}",userList.Count.ToString()); }
}
private void ReceiveData(object obj)
{
User user = (User)obj;
Socket client = user.client;
bool normalExit = false;
bool exitWhile = true;
while (exitWhile == true)
{
string receiveString = null;
try
{
receiveString = user.sr.ReadLine();
}
catch
{
Console.WriteLine("接收数据失败");
}
if (receiveString == null)
{
if (normalExit == false)
{
if (client.Connected == true)
{
Console.WriteLine(string.Format("与{0}失去联系,",client.RemoteEndPoint));
}
}
break;
}
string[] splitString = receiveString.Split(',');
string sendString = "";
switch (splitString[0])
{
case "Login":
user.userName = splitString[1].ToString();
sendString="OnlineUser,"+this.GetOnlineString();
service.SendToAll(userList,sendString); //把在线用户信息传送给在线用户 break;
case "Logout": //退出
// service.SendToAll(userList,user.userName);
normalExit = true;
exitWhile = true;
break;
//Talk,发送人名称,收件人名称,信息
case "Talk":
sendString = string.Format("Talk,{0},{1},{2},{3}", user.userName, splitString[1], splitString[2],splitString[3]);
service.SendToMsg(userList,sendString);
break;
}
} userList.Remove(user);
client.Close();
Console.WriteLine(string.Format("有一个退出,剩余连接用户数:{0}", userList.Count));
}
private string GetOnlineString()
{
string str =string.Empty;
for (int i = 0; i < userList.Count; i++)
{
str += userList[i].userName+",";
}
return str.Trim();
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net.Sockets;
namespace ConsoleApplication20
{
class User
{
public Socket client;
public StreamReader sr;
public StreamWriter sw;
public string userName;
public User(Socket client)
{
this.client = client;
this.userName = "";
NetworkStream netSream = new NetworkStream(client);
sr = new StreamReader(netSream);
sw = new StreamWriter(netSream); }
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication20
{
class Service
{ public void SendToOne(User user, string str)
{
try
{
user.sw.WriteLine(str);
user.sw.Flush();
Console.WriteLine(string.Format("向{0}发送{1}",user.userName,str));
}
catch
{
Console.WriteLine(string.Format("向{0}发送信息失败", user.userName));
}
} //向某个人发信息
public void SendToAll(List<User> userList,string str)
{ for (int i = 0; i < userList.Count; i++)
{
SendToOne(userList[i],str); }
} //向所有人发送信息
public void SendToMsg(List<User> userList,string str)
{
string [] msg = str.Split(',');
for (int i = 0; i < userList.Count; i++)
{
if (userList[i].userName == msg[2].ToString())
{
SendToOne(userList[i],str); }
}
} }
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
namespace WindowsApplication3
{
public partial class Form1 : Form
{
private TcpListener MyTcpListener;
private Socket SocketForClient;
private Thread listenThread;
private Thread recvThread;
private NetworkStream MyNetworkStream;
private StreamReader MyStreamReader;
private StreamWriter MyStreamWriter;
public Form1()
{
InitializeComponent();
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
textBox1.Text = "Tracy";
} private void button1_Click(object sender, System.EventArgs e)//启动服务器
{
IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
int port = Convert.ToInt32("8080");
MyTcpListener = new TcpListener(ipAddress, port);
MyTcpListener.Start();
try
{
// while(true)
// {
Socket s = MyTcpListener.AcceptSocket();
SocketForClient = s;
// }
listenThread = new Thread(new ThreadStart(Listen));
listenThread.Start();
}
catch (Exception ee)
{
textBox3.Text += ee.Message + "\r\n";
}
}
private void Listen()
{
if (SocketForClient.Connected)
{
textBox3.Text = "Client Connects Success !\r\n";
MyNetworkStream = new NetworkStream(SocketForClient);
MyStreamReader = new StreamReader(MyNetworkStream);
MyStreamWriter = new StreamWriter(MyNetworkStream);
recvThread = new Thread(new ThreadStart(RecvData));
recvThread.Start();
}
}
private void RecvData()//接收数据
{
string msg = MyStreamReader.ReadLine();
while (!msg.Equals("exit"))
{
textBox3.Text += msg + "\r\n";
msg = MyStreamReader.ReadLine();
}
textBox3.Text += msg + "\r\n";
ReleaseResource();
} private void button2_Click(object sender, EventArgs e)//发送数据
{
MyStreamWriter.WriteLine(textBox1.Text +"::"+ textBox2.Text);
MyStreamWriter.Flush();
textBox3.Text += textBox1.Text+"::" +textBox2.Text + "\r\n";
textBox2.Text = ""; } private void button3_Click(object sender, EventArgs e)//断开服务器
{
string exitMsg = "exit";
MyStreamWriter.WriteLine(exitMsg);
MyStreamWriter.Flush();
textBox3.Text = "Client Close!";
ReleaseResource();
}
private void ReleaseResource() //释放资源
{
MyTcpListener.Stop();
SocketForClient.Shutdown(SocketShutdown.Both);
MyNetworkStream.Close();
MyStreamReader.Close();
MyStreamWriter.Close();
listenThread.Abort();
recvThread.Abort();
} }
}
这个是有界面的,一对一是没有问题的,问题是现在要一个服务器能够独立对应多个客户端,不知道要改哪里
Socket s = MyTcpListener.AcceptSocket();
//客户端连接时,都会生一个s,那么你用一个集合来存这个s
//服务器向多个客户端发送信息事,就是遍历这些s然后发送信息就行了
//我上面的代码写得很清楚了,还是控制台的,你直接Copy就可以学习一下了