c#客户端服务端通信问题
现在想做个程序客户端服务端界面就跟下面差不多把在客户端的text1和text2里面输入文字点击确定后在服务端那边也可以显示出来但是客户端可以有很多个服务端就只有一个(客户...
现在想做个程序 客户端 服务端 界面就跟下面差不多把
在客户端的text1 和text2 里面输入文字 点击确定后 在服务端那边也可以显示出来 但是 客户端可以有很多个 服务端就只有一个(客户端退出的时候服务端不能退出要处于一直监听状态的)
悬赏分数暂时30,可用的话再加
最好有源码可以自己研究 展开
在客户端的text1 和text2 里面输入文字 点击确定后 在服务端那边也可以显示出来 但是 客户端可以有很多个 服务端就只有一个(客户端退出的时候服务端不能退出要处于一直监听状态的)
悬赏分数暂时30,可用的话再加
最好有源码可以自己研究 展开
1个回答
展开全部
这个可以满足你的要求 简单的服务器客户端 通信 下面是部分代码 详细的下载附件
//声明将要用到的类
private IPEndPoint ServerInfo;//存放服务器的IP和端口信息
private Socket ServerSocket;//服务端运行的SOCKET
private Thread ServerThread;//服务端运行的线程
private Socket[] ClientSocket;//为客户端建立的SOCKET连接
private int ClientNumb;//存放客户端数量
private byte[] MsgBuffer;//存放消息数据
private void CmdStar_Click(object sender, EventArgs e)
{
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//提供一个 IP 地址,指示服务器应侦听所有网络接口上的客户端活动
IPAddress ip = IPAddress.Any;
ServerInfo = new IPEndPoint(ip, this.GetPort());
ServerSocket.Bind(ServerInfo);//将SOCKET接口和IP端口绑定
ServerSocket.Listen(10);//开始监听,并且挂起数为10
ClientSocket = new Socket[65535];//为客户端提供连接个数
MsgBuffer = new byte[65535];//消息数据大小
ClientNumb = 0;//数量从0开始统计
ServerThread = new Thread(new ThreadStart(RecieveAccept));//将接受客户端连接的方法委托给线程
ServerThread.Start();//线程开始运行
CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用
this.CmdStar.Enabled = false;
this.CmdStop.Enabled = true;
this.StateMsg.Text = "服务正在运行..." + " 运行端口:" + this.GetPort().ToString();
this.ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 开始运行.");
}
//接受客户端连接的方法
private void RecieveAccept()
{
while (true)
{
//Accept 以同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,然后创建并返回新的 Socket。
//在阻止模式中,Accept 将一直处于阻止状态,直到传入的连接尝试排入队列。连接被接受后,原来的 Socket 继续将传入的连接请求排入队列,直到您关闭它。
ClientSocket[ClientNumb] = ServerSocket.Accept();
ClientSocket[ClientNumb].BeginReceive(MsgBuffer, 0, MsgBuffer.Length, SocketFlags.None,
new AsyncCallback(RecieveCallBack), ClientSocket[ClientNumb]);
lock (this.ClientList)
{
this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString() + " 成功连接服务器.");
}
ClientNumb++;
}
}
//回发数据给客户端
private void RecieveCallBack(IAsyncResult AR)
{
try
{
Socket RSocket = (Socket)AR.AsyncState;
int REnd = RSocket.EndReceive(AR);
//对每一个侦听的客户端端口信息进行接收和回发
for (int i = 0; i < ClientNumb; i++)
{
if (ClientSocket[i].Connected)
{
//回发数据到客户端
ClientSocket[i].Send(MsgBuffer, 0, REnd, SocketFlags.None);
}
//同时接收客户端回发的数据,用于回发
RSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), RSocket);
}
}
catch { }
}
追答
调试查看 a 第三次的值
看是否 在string[] sArray = a.Split();时取出的是两个元素
下面不是写了吗 数组越界 所以你要看sArray 第三次的数组长度
追问
感谢提示 我已经大概知道为啥了
因为在第二次发送端 字符串里根本就没有split分割的那个符号
刚才发送端重新定义下发送字符串可以了
谢谢
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询