C# socket 问题

Tommy_Yu2 2014-12-08 04:25:22


有一个server端程序,运行在8081端口。基于tcp的。

然后用telnet连接如上图所示。
在连接上时会有欢迎消息:
Welcome to rss server
==============================
然后可以在telnet下面敲任意指令过去。

以下是c#的socket的client端,不知道哪里出问题了,数据貌似发不出去,一到receive就死掉了,望高手赐教。


using System.Text;
using System.Net.Sockets;
using System.Net;

namespace RSSReader
{
public class RssClient
{
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);

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.服务器端没有收到客户端发送的消息!
3.客户端死掉了!

...全文
207 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tommy_Yu2 2014-12-08
  • 打赏
  • 举报
回复
引用 13 楼 zanfeng 的回复:
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); }
谢谢您的回答。 不好意思,我没说清楚,阻塞的是第二个receive。 第一个receive不会阻塞,因为socket连上时服务器会给客户端主动发送消息。(欢迎消息) ================================================ 感谢楼上各位的回答,该问题已经解决,问题的根源在于send没有很好的用结束符标记。在windows下面结束符应该是"\r\n"。 也即是说 client_sock.send(msg+"\r\n"), socket消息才算发出去! 否则就是放到待发送缓冲区而已。 而这个时候又去receive,所以死掉了。
足球中国 2014-12-08
  • 打赏
  • 举报
回复
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); }
足球中国 2014-12-08
  • 打赏
  • 举报
回复
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); }
Tommy_Yu2 2014-12-08
  • 打赏
  • 举报
回复
引用 6 楼 yuekunge 的回复:
[quote=引用 4 楼 lion_awake 的回复:] try 没用。。。,一直没有进入catch里面,对.net的socket不熟。 感觉有点像,数据仍然在buffer里面没发送,所以receive一直在等待。
那用 TcpClient 试下了···[/quote] 改成TcpClient一样的问题呢,不知道代码对不对,如下:
        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
Tommy_Yu2 2014-12-08
  • 打赏
  • 举报
回复
引用 7 楼 nacheng 的回复:
你确定你的IP是对的?
ip是对的,都在本地。
Tommy_Yu2 2014-12-08
  • 打赏
  • 举报
回复
引用 8 楼 WM_JAWIN 的回复:
你这不是卡死在那里。而是停在那里待待来自服务器的信息,这时你应该检查你的服务端。 这是MSDN上的:如果没有可读取的数据,则 Receive 方法将一直处于阻止状态,直到数据可用,除非使用 Socket.ReceiveTimeout 设置了超时值。如果超过超时值,Receive 调用将引发 SocketException http://msdn.microsoft.com/zh-cn/library/8s4y8aff(v=vs.80).aspx
谢谢提醒!~ 服务器端简单处理,对于非指定的指令,则立即回发消息 "unkown comand xxx",如上图所示。
WM_JAWIN 2014-12-08
  • 打赏
  • 举报
回复
你这不是卡死在那里。而是停在那里待待来自服务器的信息,这时你应该检查你的服务端。 这是MSDN上的:如果没有可读取的数据,则 Receive 方法将一直处于阻止状态,直到数据可用,除非使用 Socket.ReceiveTimeout 设置了超时值。如果超过超时值,Receive 调用将引发 SocketException http://msdn.microsoft.com/zh-cn/library/8s4y8aff(v=vs.80).aspx
那城 2014-12-08
  • 打赏
  • 举报
回复
你确定你的IP是对的?
敌敌畏耶 2014-12-08
  • 打赏
  • 举报
回复
引用 4 楼 lion_awake 的回复:
try 没用。。。,一直没有进入catch里面,对.net的socket不熟。 感觉有点像,数据仍然在buffer里面没发送,所以receive一直在等待。
那用 TcpClient 试下了···
Tommy_Yu2 2014-12-08
  • 打赏
  • 举报
回复
引用 3 楼 yuekunge 的回复:
为何不使用 TcpClient 进行连接操作。 和使用NetworkStream进行数据的发送
thanks,我试试。
Tommy_Yu2 2014-12-08
  • 打赏
  • 举报
回复
引用 2 楼 yuekunge 的回复:
症状: 1. 客户端收到了欢迎消息。 说明客户端连接成功了····· 2.服务器端没有收到客户端发送的消息! 客户端没有把数据发送过去。什么原因,卡死?堵塞?还是其他···try下··· 3.客户端死掉了! 未捕获异常,直接导致程序奔溃··
try 没用。。。,一直没有进入catch里面,对.net的socket不熟。 感觉有点像,数据仍然在buffer里面没发送,所以receive一直在等待。
敌敌畏耶 2014-12-08
  • 打赏
  • 举报
回复
为何不使用 TcpClient 进行连接操作。 和使用NetworkStream进行数据的发送
敌敌畏耶 2014-12-08
  • 打赏
  • 举报
回复
症状: 1. 客户端收到了欢迎消息。 说明客户端连接成功了····· 2.服务器端没有收到客户端发送的消息! 客户端没有把数据发送过去。什么原因,卡死?堵塞?还是其他···try下··· 3.客户端死掉了! 未捕获异常,直接导致程序奔溃··
敌敌畏耶 2014-12-08
  • 打赏
  • 举报
回复
try 下 看下什么异常···

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧