Socket_0817

——始于2010-08-17晚

 

1、服务端循环侦听,准备接收客户端的连接请求;
2、通过设定端口(7520),创建和远程终结点的连接,并判断连接是否成功建立;
3、发送数据到Socket,实现数据传送。

客户端显示已发送信息(ListBox),服务端按照“客户端IP地址 接收时间 数据内容”将每条信息显示于已接收信息(ListBox)。


未解决问题:

[Done]1、除侦听、Socket连接外,远程主机IP输入、数据发送未实现异常错误处理;

[]2、未实现多客户端连接同一服务端;

[Done]3、侦听并未进行连接就关闭窗体,释放资源、清除线程的问题;

[Done]4、服务端接收数据中,中文数据的编码问题。

 


  续:

[解决服务端中文信息编码:srRead = new StreamReader(nsStream, System.Text.Encoding.Default);]

[解决WinForm输入法切换:(load中)this.ImeMode = ImeMode.OnHalf;]

[数据发送实现异常错误处理]

 

     try
            {
                int iLength = txtMessage.Text.Length;
                //获取要发送的数据的长度 
                Byte[] bySend = new byte[iLength];
                //根据获取的长度定义一个Byte类型数组 
                bySend = System.Text.Encoding.Default.GetBytes(txtMessage.Text + "\r\n");
                //按照指定编码类型把字符串指定到指定的Byte数组 
                int i = stSend.Send(bySend);
                //发送数据 
                listSended.Items.Add(txtMessage.Text);
                txtMessage.Text = null;
                MessageBox.Show("发送成功!");
            }
            catch (Exception)
            {
                statuslbl1.Text = "未连接远程服务端!";
            }

[判断输入的远程主机IP是否为有效IP地址]

 

     if (IPAddress.TryParse(txtRemoteIP.Text,out address))
            {
                DialogResult result = MessageBox.Show("有效IP地址:" + address, "远程主机IP地址确认", 

            MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (result == DialogResult.No)
                {
                    return;
                }
           ……
      }
            else
            {
                statuslbl1.Text = "请输入有效IP地址!";
            }


 

错误日志解释

1、服务器主动关闭socket:一个封锁操作被对 WSACancelBlockingCall 的调用中断。

2、客户端主动关闭socket:远程主机强迫关闭了一个现有的连接。


[解决1]

1)未侦听:直接关闭

2)侦听但未建立连接:

            blistener = false;                    
                    System.Environment.Exit(System.Environment.ExitCode);
3)侦听并已建立连接:
          nsStream.Close(); //释放资源
          System.Environment.Exit(System.Environment.ExitCode);
代码如下:
        if (blistener)
                {
                    blistener = false;
                    if (tcpClient.Connected)
                    {
                        nsStream.Close(); //释放资源
                    }                  
                    System.Environment.Exit(System.Environment.ExitCode);                    
                }

[解决2]
客户端(Dispose):
        if (tcpConnect)
                {
                    byte[] bySend = new byte[4];
                    //根据字符串“STOP”长度来定义Byte数组 
                    bySend = System.Text.Encoding.Default.GetBytes("STOP");
                    int i = stSend.Send(bySend);
                    //发送控制码 
                    stSend.Close();
                    //关闭套接字 
                    System.Environment.Exit(System.Environment.ExitCode);
                }
服务端循环侦听:
          if (sMessage == "STOP") //判断是否为断开TCP连接控制码
                    {
                        tlTcpListen.Stop(); //关闭侦听
                        nsStream.Close(); //释放资源
                        srRead.Close();
                        statuslbl2.Text = "连接已经关闭!";
                        mythread.Abort(); //中止线程
                        return;

                    }

posted @ 2011-01-20 16:36  RF.W  阅读(309)  评论(0编辑  收藏  举报