Tcp客户端的代码

  1 using System;
  2 using System.Windows.Forms;
  3 //添加的命名空间引用
  4 using System.Net;
  5 using System.Net.Sockets;
  6 using System.Threading;
  7 using System.IO;
  8 namespace SyncChatClient
  9 {
 10     public partial class MainForm : Form
 11     {
 12         private bool isExit = false;
 13         private TcpClient client;
 14         private BinaryReader br;
 15         private BinaryWriter bw;
 16         public MainForm()
 17         {
 18             InitializeComponent();
 19             Random r = new Random((int)DateTime.Now.Ticks);//??????????????????????????????????????
 20             textBoxUserName.Text = "user" + r.Next(100, 999);//?????????????????????????????????????
 21             listBoxOnlineStatus.HorizontalScrollbar = true;//???????????????????????????????????????????????????????????????????????????
 22
 23         }
 24         /// <summary>
 25         /// 【连接服务器】按钮的Click事件
 26         /// </summary>
 27         private void buttonConnect_Click(object sender, EventArgs e)
 28         {
 29             buttonConnect.Enabled = false;
 30             try
 31             {
 32                 //此处为方便演示,实际使用时要将Dns.GetHostName()改为服务器域名
 33                 client = new TcpClient(Dns.GetHostName(), 51888);
 34                 //后面添加的函数,给文本框中添加信息
 35                 AddTalkMessage("连接成功");
 36             }
 37             catch
 38             {
 39                 AddTalkMessage("连接失败");
 40                 buttonConnect.Enabled = true;
 41                 return;
 42             }
 43             //获取网络流
 44             NetworkStream networkStream = client.GetStream();
 45             //将网络流作为二进制读写对象
 46             br = new BinaryReader(networkStream);
 47             bw = new BinaryWriter(networkStream);
 48             //向服务器端发送信息
 49             SendMessage("Login," + textBoxUserName.Text);
 50             Thread threadReceive = new Thread(new ThreadStart(ReceiveData));//???????????????????????????????????????????????????????
 51             threadReceive.IsBackground = true;//???????????????????????????????????????????????????????????????????????????
 52             threadReceive.Start();
 53         }
 54         /// <summary>处理接收的服务器端数据</summary>
 55         private void ReceiveData()
 56         {
 57             string receiveString = null;
 58             while (isExit == false)
 59             {
 60                 try
 61                 {
 62                     //从网络流中读出字符串
 63                     //此方法会自动判断字符串长度前缀,并根据长度前缀读出字符串
 64                     receiveString = br.ReadString();
 65                 }
 66                 catch
 67                 {
 68                     if (isExit == false)
 69                     {
 70                         MessageBox.Show("与服务器失去联系。");
 71                     }
 72                     break;
 73                 }
 74                 string[] splitString= receiveString.Split(‘,‘);
 75                 string command = splitString[0].ToLower();
 76                 switch (command)
 77                 {
 78                     case "login":  //格式:login,用户名
 79                         AddOnline(splitString[1]);//在listBoxOnlineStatus当中添加已经登陆的用户的信息
 80                         break;
 81                     case "logout":  //格式:logout,用户名
 82                         RemoveUserName(splitString[1]);//移除listBoxOnlineStatus当中已经离线的信息
 83                         break;
 84                     case "talk":  //格式:talk,用户名,对话信息
 85                         //AddTalkMessage(splitString[1] + ":\r\n");
 86                         //AddTalkMessage(receiveString.Substring(
 87                         //    splitString[0].Length + splitString[1].Length+2));
 88                         AddTalkMessage(string.Format("[{0}]说:{1}",
 89                             splitString[1],receiveString.Substring(
 90                             splitString[0].Length + splitString[1].Length + 2)));
 91                         break;
 92                     default:
 93                         AddTalkMessage("什么意思啊:" + receiveString);
 94                         break;
 95                 }
 96             }
 97             Application.Exit();
 98         }
 99         /// <summary>向服务器端发送信息</summary>
100         private void SendMessage(string message)
101         {
102             try
103             {
104                 //将字符串写入网络流,此方法会自动附加字符串长度前缀
105                 bw.Write(message);
106                 bw.Flush();
107             }
108             catch
109             {
110                 AddTalkMessage("发送失败!");
111             }
112         }
113         /// <summary>【发送】按钮的Click事件</summary>
114         private void buttonSend_Click(object sender, EventArgs e)
115         {
116             if (listBoxOnlineStatus.SelectedIndex != -1)
117             {
118                 //SendMessage("Talk," + listBoxOnlineStatus.SelectedItem + "," + textBoxSend.Text+"\r\n");
119                 SendMessage("Talk," + listBoxOnlineStatus.SelectedItem + "," + textBoxSend.Text);
120                 textBoxSend.Clear();
121             }
122             else
123             {
124                 MessageBox.Show("请先在[当前在线]中选择一个对话者");
125             }
126         }
127         /// <summary>关闭窗口时触发的事件</summary>
128         private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
129         {
130             //未与服务器连接前client为null
131             if (client != null)
132             {
133                 SendMessage("Logout," + textBoxUserName.Text);
134                 isExit = true;
135                 br.Close();
136                 bw.Close();
137                 client.Close();
138             }
139         }
140         /// <summary>在发送信息文本框中按下【Enter】键触发的事件</summary>
141         private void textBoxSend_KeyPress(object sender, KeyPressEventArgs e)
142         {
143             if (e.KeyChar == (char)Keys.Return)
144             {
145                 //触发buttonSend的Click事件
146                 buttonSend.PerformClick();
147             }
148         }
149         private delegate void MessageDelegate(string message);
150         /// <summary> 在richTextBoxTalkInfo中追加聊天信息</summary>
151         private void AddTalkMessage(string message)
152         {
153             if (richTextBoxTalkInfo.InvokeRequired)
154             {
155                 MessageDelegate d = new MessageDelegate(AddTalkMessage);
156                 richTextBoxTalkInfo.Invoke(d, new object[] { message });//?????????????????????????????????????????????
157             }
158             else
159             {
160                 richTextBoxTalkInfo.AppendText(message + Environment.NewLine);
161                 richTextBoxTalkInfo.ScrollToCaret();
162             }
163         }
164         private delegate void AddOnlineDelegate(string message);
165         /// <summary> 在listBoxOnlineStatus中添加在线的其它客户端信息</summary>
166         private void AddOnline(string userName)
167         {
168             if (listBoxOnlineStatus.InvokeRequired)
169             {
170                 AddOnlineDelegate d = new AddOnlineDelegate(AddOnline);
171                 listBoxOnlineStatus.Invoke(d, new object[] { userName });
172             }
173             else
174             {
175                 listBoxOnlineStatus.Items.Add(userName);
176                 listBoxOnlineStatus.SelectedIndex = listBoxOnlineStatus.Items.Count - 1;
177                 listBoxOnlineStatus.ClearSelected();
178             }
179         }
180         private delegate void RemoveUserNameDelegate(string userName);
181         /// <summary> 在listBoxOnlineStatus中移除不在线的其它客户端信息</summary>
182         private void RemoveUserName(string userName)
183         {
184             if (listBoxOnlineStatus.InvokeRequired)
185             {
186                 RemoveUserNameDelegate d = RemoveUserName;
187                 listBoxOnlineStatus.Invoke(d, userName);
188             }
189             else
190             {
191                 listBoxOnlineStatus.Items.Remove(userName);
192                 listBoxOnlineStatus.SelectedIndex = listBoxOnlineStatus.Items.Count - 1;
193                 listBoxOnlineStatus.ClearSelected();
194             }
195         }
196     }
197 }
时间: 2024-11-02 21:04:01

Tcp客户端的代码的相关文章

linux epoll机制对TCP 客户端和服务端的监听C代码通用框架实现

1 TCP简介 tcp是一种基于流的应用层协议,其"可靠的数据传输"实现的原理就是,"拥塞控制"的滑动窗口机制,该机制包含的算法主要有"慢启动","拥塞避免","快速重传". 2 TCP socket建立和epoll监听实现 数据结构设计 linux环境下,应用层TCP消息体定义如下: typedef struct TcpMsg_s { TcpMsgHeader head; void* msg; }TcpM

linux-socket tcp客户端服务器编程模型及代码详解

上一篇文章介绍了 TCP/IP相关协议,socket通信流程和涉及到的各种函数: Socket简单理解 本篇将具体解释tcp客户端服务器编程模型相关的代码 文章分为4个部分: 1. TCP客户端服务器编程模型流程图 2. 网络字节序与主机字节序 3. TCP编程的地址结构 4. 详细案例代码及解释 一: TCP客户端服务器编程模型流程图 上面两张图片将整个流程已经说明的很清楚了; 二: 网络字节序与主机字节序 字节序即是保存数据的方向方式, 分为 大端存储 和 小端存储; 其中 网络字节序 使用

[JAVA] Tcp客户端和服务器简单代码

服务器: 1 import java.io.DataInputStream; 2 import java.io.DataOutputStream; 3 import java.io.IOException; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 7 public class TcpServer { 8 public static void main(String [] args) throws IOExceptio

Windows CE 下的 TCP 客户端类

以前一直在使用 UDP 与服务器进行通讯,这次一个新的项目需要采用 TCP 来实现与服务器的通讯. 先写了一个 TCP 客户端的类,同时也做了一个服务器用于测试.先把客户端的 TCP 类代码分分享出来吧. 头文件: 1 // CeTcpClient.h: interface for the CCeTcpClient class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #i

Android编程:双工tcp客户端中应用RxJava

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:Android Studio 2.2 Preview 3 RxJava版本:2.0.1 RxAndroid版本:2.0.1 说明: 在<Android编程:双工tcp客户端>文中用双线程处理了tcp客户端的发送和接收.现在用RxJava对此客户端代码进行优化: 用RxJava创建连接,替代之前的创建连接线程 用RxJava断开连接,替代之前的断开连接线程 用RxJ

android 之TCP客户端编程

吸取教训!!!本来花了5个小时写完了,没想到,,,因为没点上面的自动保存查看一下,全没了,重新写呗 关于网络通信:每一台电脑都有自己的ip地址,每台电脑上的网络应用程序都有自己的通信端口,张三的电脑(ip:192.168.1.110)上有一个网络应用程序A(通信端口5000),李四的电脑(ip:192.168.1.220)上有一个网络应用程序B(通信端口8000),张三给李四发消息,首先你要知道李四的ip地址,向指定的ip(李四ip:192.168.1.220)发信息,信息就发到了李四的电脑.再

C# WebSocket 服务端示例代码 + HTML5客户端示例代码

WebSocket服务端 C#示例代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; using System.Threading; using System.Text.RegularExpressions; using System.Security.Cryptography; na

[Java]命令行模拟TCP客户端与服务端的简单小程序遇到的问题(基础不牢!扎实和亲手实践比什么都重要!)

简单得不能再简单的需求: 简单模拟TCP客户端与服务端的一次连接和通信,客户端发出一个消息,服务端回馈一个消息 自己第一次编写的代码: Client: class TcpClient1 { public static void main(String[] args) throws Exception { Socket s=new Socket("127.0.0.1",10010); OutputStream out=s.getOutputStream(); out.write(&quo

UDP广播 与 TCP客户端 --服务端

随着倒计时的响声,自觉无心工作,只想为祖国庆生. 最近有遇到过这样一个问题,将摄像头识别的行人,车辆实时显示在客户端中.有提供接口,会以Json的数据的形式将实时将识别的对象进行Post提交.所以我们这边先写一个web服务来持续接收数据,再将数据进行解析存入数据库.到这里为止,数据没有问题,都全部存入数据库中,这样还剩下一个实时刷新识别图片的问题.之前的处理方法是每隔5秒左右去读取数据库最新消息,用Timer计时器来解决,这样的话确实能解决问题,但是感觉不是最好的方法,因为摄像头识别的对象有时效