当前位置: 首页 > 编程语言 > C#

设置TCP-IP客户端和服务器以通过网络共享进行通信

时间:2023-04-11 12:16:57 C#

设置TCP/IP客户端和服务器以通过网络进行通信在TcpListener和TcpClient上,因为我读到它们对初学者来说稍微容易一些。我想要完成的基本要点是拥有一个可以在我的笔记本电脑和同一网络上的另一台笔记本电脑上运行的小表格,以便它们可以进行通信,即相互发送一串文本。有了这个我希望进一步发展:)到目前为止,我已经使用msdn和互联网上的各种指南创建了客户端和服务器程序。我可以让他们在一台笔记本电脑上运行时进行通信,但是当我将客户端移动到另一台笔记本电脑时,我无处可去。我认为我的主要问题是我不太明白客户端是如何找到服务器IP的,因为我认为我可以硬编码它,但是当我再次回来时,我确定IP会改变。有没有办法让双方以更动态的方式连接以包含不中断变化的IP?}privatevoidbtnConnect_Click(objectsender,EventArgse){stringmessage="Test";try{//创建一个TcpClient。//注意,为了让这个客户端工作,你需要有一个TcpServer//连接到由服务器指定的相同地址,端口//组合。Int32端口=1333;TcpClient客户端=newTcpClient(,端口);//不确定要使用的IP。//将传递的消息转换为ASCII并将其存储为字节数组。字节[]数据=System.Text.Encoding.ASCII.GetBytes(消息);//获取用于读写的客户端流。//流stream=client.GetStream();NetworkStream流=client.GetStream();//将消息发送到连接的TcpServer。stream.Write(data,0,data.Length);lstProgress.Items.Add(String.Format("发送:{0}",消息));//接收TcpServer.response。//用于存储响应字节的缓冲区。数据=新字节[256];//用于存储响应ASCII表示的字符串。字符串响应数据=String.Empty;//读取第一批TcpServer响应字节。Int32bytes=stream.Read(data,0,data.Length);responseData=System.Text.Encoding.ASCII.GetString(数据,0,字节);lstProgress.Items.Add(String.Format("Received:{0}",responseData));//关闭一切。stream.Close();客户端.Close();}catch(ArgumentNullExceptionan){lstProgress.Items.Add(String.Format("ArgumentNullException:{0}",an));}catch(SocketExceptionse){lstProgress.Items.Add(String.Format("SocketException:{0}",se));}}我之前的服务代码:privatevoidProg_Load(objectsender,EventArgse){bw.WorkerSupportsCancellation=true;bw.WorkerReportsProgress=true;bw.DoWork+=newDoWorkEventHandler(bw_DoWork);bw.ProgressChanged+=newProgressChangedEventHandler(bw_ProgressChanged);如果(bw.IsBusy!=true){bw.RunWorkerAsync();}}privatevoidbw_ProgressChanged(objectsender,ProgressChangedEventArgse){lstProgress.Items.Add(e.UserState);}privatevoidbw_DoWork(objectsender,DoWorkEventArgse){BackgroundWorkerworker=senderasBackgroundWorker;如果((worker.CancellationPending==true)){e.Cancel=true;}else{try{//在端口1333上设置TcpListener。Int32port=1333;//IP地址localAddr=IPAddress.Parse("127.0.0.1");TcpListenerserver=newTcpListener(IPAddress.Any,port);//开始监听客户端请求。服务器.启动();//读取数据的缓冲区Byte[]bytes=newByte[256];字符串数据=空;//进入监听循环。while(true){bw.ReportProgress(0,"等待连接...");//执行阻塞调用以接受请求。//你也可以在这里使用server.AcceptSocket()。TcpClientclient=server.AcceptTcpClient();bw.ReportProgress(0,"已连接!");数据=空;//获取一个用于读写的流对象NetworkStreamstream=client.GetStream();诠释我;//循环接收客户端发送的所有数据。while((i=stream.Read(bytes,0,bytes.Length))!=0){//将数据字节转换为ASCII字符串。data=System.Text.Encoding.ASCII.GetString(bytes,0,i);bw.ReportProgress(0,String.Format("收到:{0}",data));//处理客户端发送过来的数据。data=String.Format("我已经收到你的信息:{0}",data);byte[]mssg=System.Text.Encoding.ASCII.GetBytes(数据);//发回一个response.stream.Write(mssg,0,mssg.Length);bw.ReportProgress(0,String.Format("发送:{0}",data));}//关闭并结束连接client.Close();}}catch(SocketExceptionse){bw.ReportProgress(0,String.Format("SocketException:{0}",se));你可能会说我对此完全陌生,所以如果有更好的方法来做到这一点,我非常乐意学习!在此先感谢您的帮助:)我的解决方案归功于这个答案:privateStringIPAddressCheck(){varIPAddr=Dns.GetHostEntry("HostName");IP地址ipString=null;foreach(IPAddr.AddressList中的varIP){if(IPAddress.TryParse(IP.ToString(),outipString)&&IP.AddressFamily==AddressFamily.InterNetwork){break;}}返回ipString.ToString();}privatevoidbtnConnect_Click(objectsender,EventArgse){stringmessage="Test";尝试{Int32端口=1337;字符串IPAddr=IPAddressCheck();TcpClientclient=newTcpClient(IPAddr,port);我不确定它是否是最好的解决方案,但效果很好,所以感谢您的回答:)不太确定“包含更改后的IP的更动态方式”是什么意思,猜猜您目前为初学者准备的是什么:TcpClientclient=新的TcpClient(),端口);//不确定要使用的IP。您可以在同一台计算机上运行客户端和服务器并使用本地环回IP地址:IPAddress.Parse("127.0.0.1")如果它们在不同的计算机上运行,??只需将127.0.0.1替换为您的服务器正在使用的任何IP地址(假设没有NAT或防火墙)。如果你不想使用IP地址,你总是可以使用主机名(这些可能被认为更“动态”),但这需要正确配置DNS设置(对于本地系统):TcpClientclient=newTcpClient("testMachine1",1333);学习套接字编程很棒。我是网络库networkcomms.net的开发人员,所以如果您想在自学的同时也从一个工作示例向后工作,请查看此wpf聊天示例。如果您知道要连接的计算机的名称,则可以使用System.Net.DNS轻松找到其IP。varip=System.Net.Dns.GetHostEntry("JacksLaptop");字符串ipString=ip.AddressList[0].ToString();你认为正在使用的IP可能不在那个数组的0位置,所以要小心。以上就是C#学习教程的全部内容:搭建TCP/IP客户端和服务器,通过网络进行通信和共享。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络收集,不代表立场,如涉及侵权,请点击右转联系管理员删除。如需转载请注明出处: