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;
}