首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

菜鸟求教Socket程序有关问题!

2012-11-04 
初学者求教Socket程序问题!!!Socket的server端代码没有问题,问题出在client端。之前使用没有问题,程序是从

初学者求教Socket程序问题!!!
Socket的server端代码没有问题,问题出在client端。之前使用没有问题,程序是从网上下的,刚自己编了一个client来测多数据量传输会不会出现问题,结果出现一个小问题不能理解。

问题是这样的:如果client代码的最后两句clientsocket.Send(Encoding.Unicode.GetBytes(Convert.ToString(i++)));
  clientsocket.Receive(back);
  不加的话client程序会卡死,好像clientsocket.Receive(back)接不到数据,但发的数据发过去了。不理解的
  地方就在这,为什么只发一次接一次就有问题,如果在程序里再发一次接一次就没有问题了?望高手指点!


socket的server端代码:

static void Main() 
{
  IPAddress ip = IPAddress.Parse("127.0.0.1");//服务器IP地址
  //实例化套接字
  serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  //绑定套接字
  serverSocket.Bind(new IPEndPoint(ip, myport));
  //监听
  serverSocket.Listen(10);
  //Console.WriteLine("服务器已经启动");
  Thread th = new Thread(listenclient);

  th.Start();

  //result = Encoding.Unicode.GetBytes("00000");

Application.Run(new Form1());
   
}

  static void listenclient()//监听客户端
  {
  while (true)
  {

  Socket cliensocke = serverSocket.Accept();
  //Console.WriteLine("IP{0}已经连接", cliensocke.RemoteEndPoint);
  //cliensocke.Send(Encoding.Unicode.GetBytes("hello"));//为了确定连接
  Thread th = new Thread(receivemessage);
  th.Start(cliensocke);
  }
  }

  static void receivemessage(object cliensocke)
  {
  Socket myclient = (Socket)cliensocke;
  while (true)
  {
  try
  {
  //result = Encoding.Unicode.GetBytes("0");
  num = myclient.Receive(result);
  //Console.WriteLine("客户端发送的信息{0}", Encoding.Unicode.GetString(result, 0, num));
  str = Encoding.Unicode.GetString(result, 0, num);
   
  myclient.Send(Encoding.Unicode.GetBytes("ok"));
  //Thread.Sleep(2000);
  }
  catch
  {
  //int num = myclient.Receive(result);
  //Console.WriteLine("没有接收到信息");
  return;
  }
  }
  }


socket的client端代码:

namespace stability_test
{
  public partial class Form1 : Form
  {
  public Form1()
  {
  InitializeComponent();
  }

  private void timer1_Tick(object sender, EventArgs e)
  {
  byte[] back = new byte[1024];

  IPAddress ip = IPAddress.Parse("127.0.0.1");
  IPEndPoint iep = new IPEndPoint(ip, 8889);
  Socket clientsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  clientsocket.Connect(iep);

  listBox1.Items.Clear();
  //listBox1.Items.Add("9");
  //clientsocket.Send(Encoding.Unicode.GetBytes("9"));
  //clientsocket.Receive(back);

  for (int i = 0; i < 1001; i++)
  {


  string a = Convert.ToString(i);
  listBox1.Items.Add(a);
  Thread.Sleep(2000);
  clientsocket.Send(Encoding.Unicode.GetBytes(a));
  clientsocket.Receive(back);
  clientsocket.Send(Encoding.Unicode.GetBytes(Convert.ToString(i++)));
  clientsocket.Receive(back);
  }
  }


[解决办法]
不理解的
地方就在这,为什么只发一次接一次就有问题,如果在程序里再发一次接一次就没有问题了

你确定是这问题吗?你反复测试一下。

在服务器端设断点看看是否收到。

[解决办法]
receive()这个函数是会阻塞的啊,如果收不到数据,程序就会一直卡在这里。。
[解决办法]
Socket异步源码
http://blog.csdn.net/zip_xg/article/details/8083809

热点排行