请教一个Socket发送的问题

speed_eve 2008-11-19 02:55:50
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("192.168.1.234"), 11100);
sock.Connect(ipe);
string s = "欢迎光临";
byte[] msg = Encoding.UTF8.GetBytes(s);
sock.Send(msg);
我想做一个Tcp长连接,所以发送消息后,没有把sock关闭,第一次发送时服务器能接收到,但是,我在下面的继续调用sock.Send(msg);服务器却没有收到消息,请问这是怎么回事?服务器要怎样才能正常的接受数据?

服务器端接收的代码如下:
string data = "";
byte[] bytes = new Byte[1024];
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11100);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
listener.Bind(localEndPoint);
listener.Listen(10);
while (true)
{
Socket handler = listener.Accept();
bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
data = Encoding.UTF8.GetString(bytes, 0, bytesRec);
}
.......
...全文
194 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
speed_eve 2008-11-20
  • 打赏
  • 举报
回复
谢谢楼上各位,特别是:bbbbbb888888 和qinhl99 ,用异步接收已经搞定了
fxfyj1227 2008-11-19
  • 打赏
  • 举报
回复
handler.Receive(bytes);
改成handler.BeginReceive(...);
speed_eve 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 bbbbbb888888 的回复:]
Socket handler = listener.Accept();
只有再有新的连接进入时,才会向下进行.你调试下就知道了.
或者你在加个线程专门
recieveData
建议有异步的socket来做,比较通用,

---------
都回答了,难道是没看到么?
[/Quote]
这个我知道了,谢谢,但上面我说的是用异步接收数据,代码如下:
string data = "";
byte[] bytes = new Byte[1024];
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11100);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
listener.Bind(localEndPoint);
listener.Listen(10);


while (true)
{
allDone.Reset();
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
allDone.WaitOne();
}
}
剩下的就不贴了 太长了
bbbbbb888888 2008-11-19
  • 打赏
  • 举报
回复
Socket handler = listener.Accept();
只有再有新的连接进入时,才会向下进行
.你调试下就知道了.
或者你在加个线程专门
recieveData
建议有异步的socket来做,比较通用,

---------
都回答了,难道是没看到么?
speed_eve 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qinhl99 的回复:]
http://blog.csdn.net/nick4/archive/2008/06/28/2594158.aspx
[/Quote]
我在服务器端用了异步读取数据的代码(参看了上面连接的内容写的),然而问题依然没有解决,客户端使用同一个socket发送信息,第一次可以,但第二次还是没能接收到,为什么啊?如果每次重新new 一个socket来发送就正常了.
clj2201 2008-11-19
  • 打赏
  • 举报
回复
服务器端用线程处理,如下:
Socket _Socket = null;
Thread _Thread;

private void BeginListen()
{
、、、、、、相关接受处理
}




// 清理所有正在使用的资源.

protected override void Dispose(bool disposing)
{

try
{

_Socket.Close();//释放资源
_Thread.Abort();//中止线程

}

catch { }
if (disposing)
{
if (components != null)
{

components.Dispose();

}

}

base.Dispose(disposing);

}

//启动监听
private void button2_Click(object sender, EventArgs e)
{
try
{
_Thread = new Thread(new ThreadStart(BeginListen));
_Thread.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
qinhl99 2008-11-19
  • 打赏
  • 举报
回复
http://blog.csdn.net/nick4/archive/2008/06/28/2594158.aspx
speed_eve 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yilanwuyu123 的回复:]
异步调用
[/Quote]
我刚才看了下异步读取数据的代码,发现读取数据的socket需要连接到客户端才能开始异步读取.
那这样不是先要监听客户端发来的连接请求,再用异步socket去监听这个客户端发送来的数据?也就是说每连接一个客户端就要新建一个socket异步读取它发送的数据,是这样的吗?
yilanwuyu123 2008-11-19
  • 打赏
  • 举报
回复
异步调用
Derek2009 2008-11-19
  • 打赏
  • 举报
回复
楼上说的对,不过要做长连接还有很多事情要考虑的。
bbbbbb888888 2008-11-19
  • 打赏
  • 举报
回复
Socket handler = listener.Accept();
只有再有新的连接进入时,才会向下进行.你调试下就知道了.
或者你在加个线程专门
recieveData
建议有异步的socket来做,比较通用,
techsky 2008-11-19
  • 打赏
  • 举报
回复
顶起,mark

111,118

社区成员

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

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

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