public static string getData(string type) { byte[] data = new byte[1024]; Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); s.Connect("localhost", 8081); s.Receive(data); //这里去掉 或者在服务器端连上后直接发送个数据给客户端。receive是会阻塞当前线程的。
s.SendTimeout = 5000; int n= s.Send(Encoding.ASCII.GetBytes(type+"<EOF>")); //s.SendTo(Encoding.ASCII.GetBytes(type), new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8081)); s.Receive(data);//debug执行到这里就死掉了 s.Shutdown(SocketShutdown.Both); s.Close(); return Encoding.UTF8.GetString(data); }
public static string getData(string type) { byte[] data = new byte[1024]; Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); s.Connect("localhost", 8081); s.Receive(data); //这里去掉 或者在服务器端连上后直接发送个数据给客户端。receive是会阻塞当前线程的。
s.SendTimeout = 5000; int n= s.Send(Encoding.ASCII.GetBytes(type+"<EOF>")); //s.SendTo(Encoding.ASCII.GetBytes(type), new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8081)); s.Receive(data);//debug执行到这里就死掉了 s.Shutdown(SocketShutdown.Both); s.Close(); return Encoding.UTF8.GetString(data); }
1. 客户端收到了欢迎消息。说明客户端连接成功了·····2.服务器端没有收到客户端发送的消息!客户端没有把数据发送过去。什么原因,卡死?堵塞?还是其他···try下···
3.客户端死掉了!
未捕获异常,直接导致程序奔溃··
和使用NetworkStream进行数据的发送
try 没用,一直没有进入catch里面,对.net的socket不熟。
感觉有点像,数据仍然在buffer里面没发送,所以receive一直在等待。
public static string getData(string type)
{
TcpClient client = new TcpClient("localhost", 8081);
client.SendTimeout = 5000;
NetworkStream stream = client.GetStream();
try
{
String responseData = String.Empty;
string welcom_msg = "Welcome to rss server\r\n==============================";
Byte[] data = new Byte[welcom_msg.Length+2];//for "type" argument message
Int32 bytes = stream.Read(data, 0, data.Length);
data = System.Text.Encoding.ASCII.GetBytes(type);//for "type" argument message
stream.Write(data, 0, data.Length);
data = new Byte[1024];
bytes = stream.Read(data, 0, 10);
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); return responseData;
}
catch (Exception ex)
{
return ex.Message;
}
finally
{
stream.Close();
client.Close();
}
}同样:
1. 能够收到欢迎消息
2. 似乎发送不出去,服务器没有收到消息
3. 客户端一直塞在了receive那里,没有异常。直接无视了timeout
{
byte[] data = new byte[1024];
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Connect("localhost", 8081);
s.Receive(data); //这里去掉 或者在服务器端连上后直接发送个数据给客户端。receive是会阻塞当前线程的。
s.SendTimeout = 5000;
int n= s.Send(Encoding.ASCII.GetBytes(type+"<EOF>"));
//s.SendTo(Encoding.ASCII.GetBytes(type), new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8081));
s.Receive(data);//debug执行到这里就死掉了
s.Shutdown(SocketShutdown.Both);
s.Close();
return Encoding.UTF8.GetString(data);
}
{
byte[] data = new byte[1024];
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Connect("localhost", 8081);
s.Receive(data); //这里去掉 或者在服务器端连上后直接发送个数据给客户端。receive是会阻塞当前线程的。
s.SendTimeout = 5000;
int n= s.Send(Encoding.ASCII.GetBytes(type+"<EOF>"));
//s.SendTo(Encoding.ASCII.GetBytes(type), new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8081));
s.Receive(data);//debug执行到这里就死掉了
s.Shutdown(SocketShutdown.Both);
s.Close();
return Encoding.UTF8.GetString(data);
}
谢谢您的回答。
不好意思,我没说清楚,阻塞的是第二个receive。
第一个receive不会阻塞,因为socket连上时服务器会给客户端主动发送消息。(欢迎消息)================================================
感谢楼上各位的回答,该问题已经解决,问题的根源在于send没有很好的用结束符标记。在windows下面结束符应该是"\r\n"。
也即是说 client_sock.send(msg+"\r\n"), socket消息才算发出去!
否则就是放到待发送缓冲区而已。
而这个时候又去receive,所以死掉了。