一个c/s类软件服务端(一台主机) 接收客户端数据 处理后返回相应的的数据客户端(多台) 连接服务端 并向服务端发送数据 收到服务端返回的数据 进行相应的操作要求首先声明 我是新人 问的问题 或者表达的方式 可能在各位大大看来很 没水准 。呵呵代码最好有注释 方便我理解
用到tcp协议来做数据传输接收
要用到线程技术来为每个连接的客户端创建相应的线程
windowsForms平台的谢谢!
用到tcp协议来做数据传输接收
要用到线程技术来为每个连接的客户端创建相应的线程
windowsForms平台的谢谢!
解决方案 »
- c#程序中有很多的textbox,现在想当其中任意一个为空就弹出“请输入数据”
- datagridview问题
- cx.Visible = true;
- 我用vs2005的串口控件接收数据,稍微长一点的数据如10多个字节都无法接收到,这是怎么回事呢?谢谢
- 请高人指点!
- 看不懂了,请高人给小弟讲讲Windows Service是怎么实现的?
- 请问怎用C#生成静态html文件?
- SetWindowPos函数里面的一个参数问题。
- 现在我想检测2项 framwork 和 MDAC2。7 检测没有FramWork 的话 就安装 dotnetfx.exe 安装完的话 就都退出来了, 得再重新启动安装程序
- C#中关于对象生存期的问题
- 求一正则表达式
- 用C#.NET编程时如何导入数据表
TcpListener listener = new TcpListener(10000);//使用10000端口
listener.Start();//开始侦听
TcpClient client = listener.AccpTcpClient();//收到连接请求
[Client:]
TcpClient client = new TcpClient("对方IP地址",10000);
client.Connect();//连接服务器
TcpListener listener = new TcpListener(IPAddress.Any, 5050); // 在0.0.0.0:5050上侦听
listener.Start(); // 侦听开始while (True) // 处理一个客户端连接后再接连处理下一个客户端连接,这里最好做成线程去处理
{
TcpClient remoteClient = listener.AcceptTcpClient(); // 接收客户端连接
NetworkStream streamToClient = remoteClient.GetStream(); // 接收网络流
byte[] buffer = new byte[BufferSize]; // 设置接收缓冲
int bytesRead = streamToClient.Read(buffer, 0, BufferSize); // 读以网络流
string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead); // 把网络流转成文本
// 处理文本信息
textBox1.Text += msg + "\r\n"; // 用一个设置了多行的文本框来显示接收的信息
}
客户端:
string msg = "向服务器发送这个文本内容!"; // msg为要发送的信息
TcpClient client = new TcpClient();
IPAddress ip = IPAddress.Parse(RemoteHost); // 这里的RemoteHost指的是运行服务端的机器IP
IPEndPoint ipe = new IPEndPoint(ip, 505);
client.Connect(ipe); // 连接服务器NetworkStream streamToServer = client.GetStream();
byte[] buffer = Encoding.Unicode.GetBytes(msg); // msg为要发送的信息
streamToServer.Write(buffer, 0, buffer.Length); // 发往服务器
streamToServer.Close(); // 关闭网络流
streamToServer.Dispose();
client.Close(); 关闭客户端连接
http://www.cnblogs.com/kerryking/archive/2008/08/03/1259259.html
void Main()
{
IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); //默认地址
TcpListener tcpListener = new TcpListener(ipAddress,500);
tcpListener.Start();
while (isListen) //以一个死循环来实现监听
{
ChatClient chatClient = new ChatClient(tcpListener.AcceptTcpClient()); //调用一个ChatClient对象来实现监听 }
tcpListener.Stop();
}public class ChatClient
{
private TcpClient _tcpClient;
private byte[] byteMessage;
private string _clientEndPoint; public volatile string message;
public static Hashtable clients= new Hashtable(); //以此静态变量存处多个客户端地址
public ChatClient(TcpClient tcpClient)
{
_tcpClient = tcpClient;
_clientEndPoint = _tcpClient.Client.RemoteEndPoint.ToString();
Console.WrtieLine("连接成功,客户端EndPoint为"+_clientEndPoint); ChatClient.clients.Add(_clientEndPoint, this); //每创建一个对象,就会将客户端的ChatClient对象存入clients; byteMessage=new byte[_tcpClient.ReceiveBufferSize]; lock (_tcpClient.GetStream()) //接收信息,使用lock避免数据冲突 { _tcpClient.GetStream().BeginRead(byteMessage, 0, _tcpClient.ReceiveBufferSize, new AsyncCallback(Receive), null); //就在此处使用异步的IO线程进行数据读取,这样每个一客户端的都处于一个IO线程中处理,使主线程及早得到释放 //这样做就缓解了服务器端压力。
}
} public void Receive(IAsyncResult iAsyncResult)
{
try
{
int length;
lock (_tcpClient.GetStream()) //信息接收,使用lock避免数据冲突
{
length= _tcpClient.GetStream().EndRead(iAsyncResult);
}
if (length < 1)
{
MessageBox.Show(_tcpClient.Client.RemoteEndPoint + "已经断线");
clients.Remove(_tcpClient);
return ;
} message=Encoding.Unicode.GetString(byteMessage,0,length);
Console.WriteLine(“客户端”+_clientEndPoint+“信息:”+message);
//在此处我只是实现一个简单的信息显示
//正常情况下,在实现聊天室时,我们可以在此处调用clients变量,为每个客户端发送信息 lock (_tcpClient.GetStream()) //再次监听,使用lock避免数据冲突
{
_tcpClient.GetStream().BeginRead(byteMessage, 0, _tcpClient.ReceiveBufferSize, new AsyncCallback(Receive), null); //再次调用Stream.BeginRead方法,以监听以下次客户的信息
}
}
catch (Exception ex)
{
clients.Remove(_tcpClient);
_tcpClient.GetStream().Close();
_tcpClient.Close();
}
}
}