下面是我用sockets接受信息的代码;但每次运行到Socket temp = s.Accept();//为新建连接创建新的Socket就没反应了,也不报错,这是怎么回事,大家帮忙看下;using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
namespace sever
{
           public partial class Form1 : Form
    {
              public Form1()
        {
            InitializeComponent();
        }        private void Form1_Load(object sender, EventArgs e)
        {
          //WinsockSrv        }               private void timer1_Tick(object sender, EventArgs e)
               {
                   try
                   {
                       int port = 2000;
                       //string host="127.0.0.1";
                       string host = "192.168.0.113";
                       IPAddress ip = IPAddress.Parse(host);
                       IPEndPoint ipe = new IPEndPoint(ip, port);
                       Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
                       s.Bind(ipe);//绑定2000端口
                       s.Listen(0);//开始监听
                       Console.WriteLine("Waitforconnect");
                       Socket temp = s.Accept();//为新建连接创建新的Socket。                       Console.WriteLine("Getaconnect");
                       string recvStr = "";
                       byte[] recvBytes = new byte[1024];
                       int bytes;
                       bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
                       recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
                       //Console.WriteLine("ServerGetMessage:{0}",recvStr);//把客户端传来的信息显示出来
                       MessageBox.Show(recvStr);
                       string sendStr = "Ok!ClientSendMessageSucessful!";
                       byte[] bs = Encoding.ASCII.GetBytes(sendStr);
                       temp.Send(bs, bs.Length, 0);//返回客户端成功信息
                       temp.Close();
                       s.Close();
                   }
                   catch (ArgumentNullException ee)
                   {
                       Console.WriteLine("ArgumentNullException:{0}", ee);
                   }
                   catch (SocketException ee)
                   {
                       Console.WriteLine("SocketException:{0}", ee);
                   }
                   Console.WriteLine("PressEntertoExit");
                   Console.ReadLine();
               }
    }
}

解决方案 »

  1.   

    s.Listen(0);的问题,改成大于0的数
      

  2.   

    Accept是阻塞方法,直到有客户端连接上来才会返回的。
      

  3.   

    参考客户端代码:
    http://blog.csdn.net/luols/archive/2010/06/29/5702441.aspx
      

  4.   

    luols;请问下,我用你的代码时,给出如下提示,这是为什么?
    由于目标机器积极拒绝,无法连接。
      

  5.   

    Accept是阻塞方法,直到有客户端连接上来才会返回的。程序运行到 Accept的时候就会等待,等待客户端连接
      

  6.   

    Accept是阻塞方法,你可以单独开一个线程去做,但是我看你放到Timer的Tick事件里处理,很是不妥.
      

  7.   

    请问各位,下面这句中的2000是怎么来的??
    IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("192.168.0.32"), 2000);  
      

  8.   

    int port = 2000;
    string host = "192.168.0.113";因为你这边的服务器端是这个ip和端口,所以客户端理应是:
    IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("192.168.0.113"), 2000); 
    要和服务端保持一致,因为客户端是要连到这个服务端的
      

  9.   

    luols;你的意思是说客户端我服务端的IP和端口要一致??
      

  10.   

    Accept是阻塞方法,是等待连接,只有客户端连接上来才会继续下面的代码
    还有Socket temp = s.Accept();应该放在死循环中这样才能一直接收客户端发送的东西
    不然只能接收一次不能再接收啦
      

  11.   

    同意楼上的,等待客户端的连接
     while(true)
    {
    Socket socket = listen.acceptsocket();接收信息代码
    while(true)
    {}
    }
    这样可以多次连接,否则只能连接一次,提示已经关闭连接
      

  12.   

    刚才搞清楚了,我的打卡机发出来的是ASCII码,所以我的接受这边应该是要跟着变才行,请问下要怎样改呢?
      

  13.   

    参考:http://topic.csdn.net/u/20100614/02/37623bb5-bb18-4222-a9d4-1d95f718eef0.html
      

  14.   

    s.Listen(10);//开始监听  表示监听的最大队列  
    s.WaitOne();
      

  15.   

    搞好了,原来发数据的打卡机用的是UDP协议,服务器用的是TCP协议