http://community.csdn.net/Expert/topic/3707/3707072.xml?temp=.0852167

解决方案 »

  1.   

    newsk=sk.Accept();
    应放在private void jieshou()里面。
      

  2.   

    一个简单的例子,你可以参考一下
    服务端:using System;
    using System.Threading;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;class ServerApp
    {
    public static void Main()
    {
    Server server=new Server();
    server.Start();
    }
    }
    class Server
    {
    private IPAddress ip;
    private int port;
    private TcpListener listener;
    private Socket client;
    private ZengSir processor;
    private Thread processingThread;

    public Server()
    {
    InitializeComponents();
    }
    private void InitializeComponents()
    {
    port=44444;
    listener=new TcpListener(IPAddress.Any,port);
    listener.Start();
    }
    public void Start()
    {
    try
    {
    while(true)
    {
    client=listener.AcceptSocket();
    processor=new ZengSir(client);
    processingThread=new Thread(new ThreadStart(processor.Process));
    processingThread.Start();
    }
    }
    catch(Exception ex)
    {
    Console.WriteLine(ex.ToString());
    }
    finally
    {
    listener.Stop();
    }
    }
    }public class ZengSir
    {
    private bool quitRequested;
    private string welcomeMessage;
    private NetworkStream stream;  //System.Net.Sockets
    private StreamWriter writer;
    private StreamReader reader;
    private Socket client;
    private string clientCommand;

    public ZengSir(Socket client)
    {
    this.client=client;
    InitializeComponent();
    }
    private void InitializeComponent()
    {
    quitRequested=false;
    welcomeMessage="220 "+System.Environment.MachineName
    +"Time Server ready.\r\n"
    +"Supported command: \r\n"
    +" G:Get server time\r\n"
    +" Q:Quit\r\n";
    stream=new NetworkStream(client);
    writer=new StreamWriter(stream);
    writer.AutoFlush=true;
    reader=new StreamReader(stream);
    }
    public void Process()
    {
    try
    {
    writer.WriteLine(welcomeMessage);
    while(!quitRequested)
    {
    writer.Write("telnet>");
    clientCommand=reader.ReadLine();
    switch(clientCommand)
    {
    case "Q":
    case "q":
    quitRequested=true;
    break;
    case "G":
    case "g":
    writer.WriteLine(DateTime.Now);
    break;
    default:
    writer.WriteLine("Supported Command: G, Q.");
    break;
    }
    }
    }
    catch(Exception ex)
    {
    Console.WriteLine(ex.ToString());
    }
    finally
    {
    writer.Close();
    reader.Close();
    stream.Close();
    client.Close();
    }
    }
    }
      

  3.   

    客户端:
    using System;
    using System.Threading;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;
    using System.Text.RegularExpressions;
    namespace ClientApp
    {
    class ClientApp
    { [STAThread]
    static void Main(string[] args)
    {
    MyClient myClient = new MyClient();
    myClient.Run();
    }
    } class MyClient
    {
    private string hostIP;
    private string hostPort;
    private TcpClient client;
    private NetworkStream stream;

    public MyClient()
    {
    InitializeComponents();
    } private void InitializeComponents()
    {
    Console.WriteLine( "Client is running ... " );
    bool inputCorrect = false;
    while( inputCorrect != true )
    {
    Console.Write("Please input the HostIP: ");
    hostIP = Console.ReadLine();
    Console.Write("Please input the HostPort: ");
    hostPort = Console.ReadLine();
    if( IsValidIPAddress(hostIP) != true || IsValidPort(hostPort) != true ) 
    Console.WriteLine(">  Error: Invalid IP or Port!");
    else
    inputCorrect = true;
    } } private bool IsValidIPAddress( string strIP )
    {
    // Return true if strIP is in valid ipAddress format.
    return Regex.IsMatch(strIP,@"^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$"); 
    } private bool IsValidPort( string strPort )
    {
    int port;
    if( Regex.IsMatch(strPort, "^[0-9]*[1-9][0-9]*$") )
    {
    port = Convert.ToInt32(strPort);
    if( port < 65535 )
    return true;
    }
    return false;
    } public void Run()
    {
    try
    {
    client = new TcpClient();
    Console.WriteLine("Connect " + hostIP + ":" + hostPort); 
    client.Connect( IPAddress.Parse(hostIP), Int32.Parse(hostPort) );
    Console.WriteLine("Connected Successfully.");
    stream = client.GetStream();
    Student student = new Student(stream);
    student.Process();
    }
    catch( Exception err )
    {
    Console.WriteLine(err.ToString());
    }
    finally
    {
    client.Close();
    }
    }
    } class Student
    {
    private bool over;
    private NetworkStream stream;  //System.Net.Sockets
    private StreamWriter writer;
    private StreamReader reader;
    private string clientCommand;
    private string serverResponse;
    private char[] buffer; public Student(NetworkStream stream)
    {
    this.stream = stream;
    InitializeComponent();
    }
    private void InitializeComponent()
    {
    over = false;
    writer = new StreamWriter(stream);
    writer.AutoFlush=true;
    reader = new StreamReader(stream);
    buffer = new char[7];
    }
    public void Process()
    {
    try
    {
    serverResponse = reader.ReadLine();
    while( serverResponse != "")
    {
    Console.WriteLine( serverResponse );
    serverResponse = reader.ReadLine();
    }
    while( !over )
    {
    reader.Read(buffer, 0, 7);
    Console.Write(new string(buffer));
    clientCommand = Console.ReadLine();
        writer.WriteLine(clientCommand);
    if(clientCommand == "Q" || clientCommand == "q")
    {
    over = true;
    break;
    }
    Console.WriteLine( reader.ReadLine() );
    }
    }
    catch(Exception ex)
    {
    Console.WriteLine(ex.ToString());
    }
    finally
    {
    writer.Close();
    reader.Close();
    stream.Close();
    }
    }
    }
    }
      

  4.   

    你应该把那些有可能产生异常的代码,放入Try Catch中,在Catch中把 e.StackTrace 弹出来看看问题出在哪
      

  5.   

    chenzhanyiczy(hi)说的是对的,改了之后就是正确的了!
      

  6.   

    呵呵,实际上你已经收到了。只是看不到罢了。这样的阻塞UI线程的方法非常糟糕。如果客户机不Send的话界面就会未响应。
    如果你的kaishi只执行一次那么你就只能接收一个客户端的连接。如果执行多次一定会产生异常。仅仅是为了测试可以将
    newsk=sk.Accept();
    xc=new Thread(new ThreadStart(jieshou));
    xc.Start();
    改为
    byte[] by=new byte[555];
    newsk.Receive(by);
    string sj=System.Text.Encoding.Default.GetString(by);
    this.richTextBox1.AppendText(sj+"\r\n");
    没有必要使用一个根本就不起任何作用的线程。
      

  7.   

    你在客户端用get()得到的是本机的ip因此,你连接的也是本机的端口,你应该是连接服务器端的ip!