很久很久没来这里,但还上常记得大家。有一问题请大家帮忙,谢谢我开发一个C#的服务器和客户端通信问题,编程使用的通信对象为:
private IPEndPoint client;
private Socket server;
private NetworkStream stream;
private TextWriter writer;
private TextReader reader;其实就是平时简单的方式通信,虽然方式简单,但遇到了郁闷的问题,解决很久了,求教大家帮我。情况是这样的
1,如果客户端先给服务端发送数据,那么“无法从传输连接中读取数据。”错误
2,如果服务器端先给客户端发送数据,那么可以发送和接收到,同时,客户端可以接来下发送数据到服务端,这都正确,但这时如果服务端想再发送数据到客户端,那么““无法从传输连接中读取数据。”错误我该怎么办?
服务端代码:
private void ThreadServer()
{
client = new IPEndPoint(IPAddress.Any,8000);
server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
server.Blocking = true;
//server.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.SendTimeout,3000);
//server.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout,3000);
server.Bind(client);
server.Listen(400);
while(true)
{
Socket t = server.Accept();
if(t != null)
{
stream = new NetworkStream(t);
writer = new StreamWriter(stream);
reader = new StreamReader(stream);
try
{
richTextBox1.Text += reader.ReadLine();
richTextBox1.Text += "\n";
}
catch(Exception g)
{
MessageBox.Show(g.Message);
}
writer.WriteLine("欢迎连接到服务器");
writer.Flush();
reader.Close();
writer.Close();
stream.Close();
t.Close();
}
}
}我该怎么解决?谢谢大家
private IPEndPoint client;
private Socket server;
private NetworkStream stream;
private TextWriter writer;
private TextReader reader;其实就是平时简单的方式通信,虽然方式简单,但遇到了郁闷的问题,解决很久了,求教大家帮我。情况是这样的
1,如果客户端先给服务端发送数据,那么“无法从传输连接中读取数据。”错误
2,如果服务器端先给客户端发送数据,那么可以发送和接收到,同时,客户端可以接来下发送数据到服务端,这都正确,但这时如果服务端想再发送数据到客户端,那么““无法从传输连接中读取数据。”错误我该怎么办?
服务端代码:
private void ThreadServer()
{
client = new IPEndPoint(IPAddress.Any,8000);
server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
server.Blocking = true;
//server.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.SendTimeout,3000);
//server.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout,3000);
server.Bind(client);
server.Listen(400);
while(true)
{
Socket t = server.Accept();
if(t != null)
{
stream = new NetworkStream(t);
writer = new StreamWriter(stream);
reader = new StreamReader(stream);
try
{
richTextBox1.Text += reader.ReadLine();
richTextBox1.Text += "\n";
}
catch(Exception g)
{
MessageBox.Show(g.Message);
}
writer.WriteLine("欢迎连接到服务器");
writer.Flush();
reader.Close();
writer.Close();
stream.Close();
t.Close();
}
}
}我该怎么解决?谢谢大家
//否則引起阻塞
reader.ReadLine();//客戶端可能也有問題。因爲客戶款和服務器端同時從流裏讀取數據。
server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
server.Bind(client);
server.Listen(50);
Thread th = new Thread (new ThreadStart(accpet));
th.Start(); //开始监听private void accpet()
{
while(true)
{...} // 建立连接最好是用多线程方式 ,使用建立的连接收发消息最好也另起线程}你先这样试试吧
Socket _socket;
byte[] buf;
public Server()
{
buf = new byte[4096];
}
public void Start()
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_socket.Bind(new IPEndPoint(IPAddress.Any,5000));
_socket.Listen(5);
_socket.BeginAccept(new AsyncCallback(AcceptCallBack),null);
} private void AcceptCallBack(IAsyncResult ar)
{
Socket newsocket;
try
{
newsocket = _socket.EndAccept(ar);
newsocket.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(ReadCallBack), newsocket);
}
finally
{
_socket.BeginAccept(new AsyncCallback(AcceptCallBack), null);
}
}
public void Send(string message)
{
} public void Send(Socket socket,string str)
{
if (socket.Connected)
{
byte[] b = System.Text.Encoding.UTF8.GetBytes(str);
socket.Send(b, 0, b.Length, SocketFlags.None);
}
}
private void ReadCallBack(IAsyncResult ar)
{
try
{
Socket newsocket = ar.AsyncState as Socket;
int ret = newsocket.EndReceive(ar);
if (ret > 0)
{
Console.WriteLine("recv from {0}:{1}", newsocket.RemoteEndPoint.ToString(), System.Text.Encoding.UTF8.GetString(buf, 0, ret));
Send(newsocket, "ok");
newsocket.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(ReadCallBack), newsocket);
}
else
{
Console.WriteLine("exit");
}
}
catch (SocketException ex)
{
Console.WriteLine("exit");
}
catch (ObjectDisposedException)
{
}
catch
{
}
}