C#面向连接的TCP同步通信Word格式.docx
- 文档编号:4946311
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:20
- 大小:39.10KB
C#面向连接的TCP同步通信Word格式.docx
《C#面向连接的TCP同步通信Word格式.docx》由会员分享,可在线阅读,更多相关《C#面向连接的TCP同步通信Word格式.docx(20页珍藏版)》请在冰点文库上搜索。
操作使用方法如下:
1、程序启动后首先点击“监听”按钮(两个客户端均要执行该操作),
然后在“对方IP”文本框中输入一个要连接的对方IP(如果是本机,则输入本机IP,本机IP已在聊天信息文本框中显示)。
2、输入完毕后点击“连接远程”按钮,程序会提示连接成功与否,如果连接成功,界面如下图
3、此时在“发送信息”文本框中,点击“发送”按钮,便可以进行正常通信。
4、通信结束后,点击“关闭”按钮,程序再次进入监听状态,可以接受其他客户端的链接请求。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Net.Sockets;
usingSystem.Net;
usingSystem.Threading;
namespaceTCPconn
{
publicpartialclassForm1:
Form
{
#region字段
privateIPAddressHostIp,RemoteIP;
privateintportListen=10000;
privateintportLink=8000;
privateIPEndPointendPoint;
privateSocketsocket=null;
privateSocketacceptSocket=null;
privateSocketsendSocket=null;
ThreadthreadListen=null;
ThreadthreadSend=null;
privateintlen=0;
//接收字节数
#endregion字段
#region构造函数
publicForm1()
InitializeComponent();
IPHostEntryhost=Dns.GetHostEntry(Dns.GetHostName());
foreach(IPAddressipinhost.AddressList)
if(!
ip.IsIPv6LinkLocal)
textBox_accept.AppendText("
本机IP地址:
"
+ip.ToString()+"
\n"
);
HostIp=ip;
}
endPoint=newIPEndPoint(HostIp,portListen);
#endregion构造函数
#region委托
///<
summary>
///在接收文本框中附加信息
/summary>
paramname="
str"
>
<
/param>
delegatevoidSetTextCallback(stringstr);
//执行函数
privatevoidsetText(stringstr)
textBox_accept.AppendText(str);
///设置“连接按钮”可用性
state"
delegatevoidSetBtnEnableHandler(boolstate);
privatevoidsetEnable(boolstate)
btn_link.Enabled=state;
#endregion委托
#region自定义函数
///打开端口监听
privatevoidopenListener()
this.Invoke(newSetTextCallback(setText),newobject[]{"
已经开启监听!
});
try
socket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
socket.Bind(endPoint);
socket.Listen(0);
//acceptSocket=socket.Accept();
if(threadListen!
=null)
threadListen.Abort();
catch(Exception){}
threadListen=null;
threadListen=newThread(newThreadStart(Proccess1));
threadListen.Start();
catch(Exceptionex)
MessageBox.Show(ex.Message);
///发送信息
msg"
要发送的信息内容<
privatevoidsendMessage(stringmsg)
byte[]sendByte=newbyte[msg.Length];
sendByte=Encoding.Unicode.GetBytes(msg.ToCharArray());
if(acceptSocket!
=null)
if(acceptSocket.Connected)
//textBox_accept.AppendText(acceptSocket.RemoteEndPoint.ToString()+"
acceptSocket.Send(sendByte,sendByte.Length,0);
elseif(sendSocket!
if(sendSocket.Connected)
//textBox_accept.AppendText(sendSocket.RemoteEndPoint.ToString()+"
sendSocket.Send(sendByte,sendByte.Length,0);
MessageBox.Show("
发送失败:
+ex.Message);
///链接远程客户端
remoteIP"
远程客户端的IP地址<
privatevoidremoteLink(IPAddressremoteIP)
//如果此时监听线程仍在工作,则关闭监听线程
if(threadListen!
if(socket!
socket.Close();
finally
socket=null;
acceptSocket.Close();
acceptSocket=null;
//远程端口
IPEndPointremotePoint=newIPEndPoint(remoteIP,portLink);
sendSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sendSocket.Connect(remotePoint);
if(threadSend!
threadSend.Abort();
threadSend=null;
threadSend=newThread(newThreadStart(sendProc1));
threadSend.Start();
btn_link.Enabled=false;
stringsendStr="
已经与"
+this.textBox_user.Text.Trim()+"
建立连接"
;
byte[]sendByte=newbyte[sendStr.Length];
sendByte=Encoding.Unicode.GetBytes(sendStr.ToCharArray());
btn_link.Enabled=true;
服务器没有开启\r\n"
///主监听进程
privatevoidProccess1()
while(true)
if(acceptSocket==null)
acceptSocket=socket.Accept();
else
byte[]recBytes=newbyte[512];
len=acceptSocket.Receive(recBytes,recBytes.Length,0);
stringstrInfo=Encoding.Unicode.GetString(recBytes,0,len);
if(len>
=3)
if(strInfo.Substring(0,3)=="
)
this.Invoke(newSetBtnEnableHandler(setEnable),newobject[]{false});
byte[]sendBytes=newbyte[64];
sendBytes=Encoding.Unicode.GetBytes("
对方已接收链接请求,可以开始通信!
.ToCharArray());
acceptSocket.Send(sendBytes,sendBytes.Length,0);
if(strInfo=="
关闭通信"
acceptSocket.Shutdown(SocketShutdown.Both);
strInfo="
对方已将通信关闭,重新开始监听!
//关闭当前使用的套接字和进程
this.Invoke(newSetBtnEnableHandler(setEnable),newobject[]{true});
this.Invoke(newSetTextCallback(setText),newobject[]{strInfo});
catch(Exception)
//MessageBox.Show(ex.ToString());
//MessageBox.Show("
接收失败"
///连接远程主机后的监听进程
privatevoidsendProc1()
len=sendSocket.Receive(recBytes);
//this.closeSocket();
//强行重新打开监听
this.openListener();
sendSocket.Shutdown(SocketShutdown.Both);
sendSocket.Close();
//关闭当前使用的套接字
sendSocket=null;
接收失败\n"
///关闭套接字
privatevoidcloseSocket()
=null)//关闭主监听套接字
=null)//关闭接收数据套接字
if(sendSocket!
=null)//关闭用于接收远程连接数据的套接字
///关闭所有的进程
privatevoidcloseThread()
try//尝试关闭sendProc线程
try//尝试关闭Proccess线程
if(threadSend!
#endregion自定义函数
///开启主监听进程
sender"
e"
privatevoidbtn_login_Click(objectsender,EventArgse)
textBox_user.Text="
///点击发送按钮
privatevoidbtn_send_Click(objectsender,EventArgse)
stringsendStr=HostIp.ToString()+"
:
+textBox_send.Text;
本机:
+textBox_send.Text+"
this.sendMessage(sendStr);
///关闭通信程序
privatevoidbtn_close_Click(objectsender,EventArgse)
this.sendMessage("
this.closeThread();
//关闭进程
this.closeSocket();
//关闭套接字
当前通信连接已经关闭!
///连接远程主机
privatevoidbtn_link_Click(objectsender,EventArgse)
if(textBox_user.Text.Trim()=="
return;
RemoteIP=IPAddress.Parse(textBox_user.Text.Trim());
textBox_user.Focus();
textBox_user.SelectAll();
this.remoteLink(RemoteIP);
privatevoidForm1_FormClosing(objectsender,FormClosingEventArgse)
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 面向 连接 TCP 同步 通信