今天仔细研究了一下Learning hard Learning hard的博客《C#网络编程系列五:TCP编程》,就花了一下午的时间重敲了一下上面的代码,加深了对运输层TCP协议的了解,详细的关于TCP的介绍,请你们看上面的博客,里面有详细的介绍,俺是个菜鸟,处于学习阶段,就不班门弄斧了编程
下面我把我花了一下午重写的代码贴到下面,供你们参考,有什么意见请指出,不胜感激服务器
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.Net.Sockets;
- using System.IO;
- using System.Net;
- using System.Threading;
- namespace Tcp客户端
- {
- public partial class Form1 : Form
- {
- #region 变量定义
- //声明变量
- private TcpClient tcpClient = null;
- private NetworkStream networkStream = null;
- private BinaryReader reader;
- private BinaryWriter writer;
- //申明委托
- //显示消息
- private delegate void ShowMessage(string str);
- private ShowMessage showMessageCallback;
- //申明委托
- //显示状态
- private delegate void ShowStatus(string str);
- private ShowStatus showStatusCallback;
- //申明委托
- //清空消息
- private delegate void ResetMessage();
- private ResetMessage resetMessageCallback;
- #endregion
- public Form1()
- {
- InitializeComponent();
- //显示消息
- showMessageCallback = showMessage;
- //显示状态
- showStatusCallback = showStatus;
- //清空消息
- resetMessageCallback = resetMessage;
- }
- #region 定义委托函数
- //显示消息
- private void showMessage(string str)
- {
- lbMessageView.Items.Add(tcpClient.Client.RemoteEndPoint);
- lbMessageView.Items.Add(str);
- lbMessageView.TopIndex = lbMessageView.Items.Count - 1;
- }
- //显示状态
- private void showStatus(string str)
- {
- toolStripStatusLabel1.Text = str;
- }
- //清空消息
- private void resetMessage()
- {
- tbMessage.Text = "";
- tbMessage.Focus();
- }
- #endregion
- //创建链接
- private void btnConnection_Click(object sender, EventArgs e)
- {
- // 经过一个线程发起请求,多线程
- Thread connectThread = new Thread(ConnectToServer);
- connectThread.Start();
- }
- private void ConnectToServer()
- {
- try
- {
- //调用委托
- statusStrip1.Invoke(showStatusCallback, "正在链接……");
- if (txtIP.Text == string.Empty || txtPort.Text == string.Empty)
- {
- MessageBox.Show("请先输入服务器的IP地址和端口号");
- }
- IPAddress ipaddress = IPAddress.Parse(txtIP.Text);
- tcpClient = new TcpClient();
- tcpClient.Connect(ipaddress, int.Parse(txtPort.Text));
- //延时操做
- Thread.Sleep(1000);
- if (tcpClient != null)
- {
- statusStrip1.Invoke(showStatusCallback, "链接成功");
- networkStream = tcpClient.GetStream();
- reader = new BinaryReader(networkStream);
- writer = new BinaryWriter(networkStream);
- }
- }
- catch
- {
- statusStrip1.Invoke(showStatusCallback, "链接失败");
- Thread.Sleep(1000);
- statusStrip1.Invoke(showStatusCallback, "就绪");
- }
- }
- //断开链接
- private void btnDisconnect_Click(object sender, EventArgs e)
- {
- if (reader != null)
- {
- reader.Close();
- }
- if (writer != null)
- {
- writer.Close();
- }
- if (tcpClient != null)
- {
- // 断开链接
- tcpClient.Close();
- }
- toolStripStatusLabel1.Text = "断开链接";
- }
- //接受消息
- private void btnRecev_Click(object sender, EventArgs e)
- {
- Thread receiveThread = new Thread(receiveMessage);
- receiveThread.Start();
- }
- private void receiveMessage()
- {
- statusStrip1.Invoke(showStatusCallback, "接受中");
- try
- {
- string receivemessage = reader.ReadString();
- lbMessageView.Invoke(showMessageCallback, receivemessage);
- }
- catch
- {
- if (reader != null)
- {
- reader.Close();
- }
- if (writer != null)
- {
- writer.Close();
- }
- if (tcpClient != null)
- {
- tcpClient.Close();
- }
- statusStrip1.Invoke(showStatusCallback, "断开了链接");
- }
- }
- //清除消息
- private void btnClear_Click(object sender, EventArgs e)
- {
- lbMessageView.Items.Clear();
- }
- //发送消息
- private void btnSend_Click(object sender, EventArgs e)
- {
- Thread sendThread = new Thread(SendMessage);
- sendThread.Start(tbMessage.Text);
- }
- private void SendMessage(object state)
- {
- try
- {
- statusStrip1.Invoke(showStatusCallback, "正在发送……");
- writer.Write(state.ToString());
- Thread.Sleep(3000);
- writer.Flush();
- statusStrip1.Invoke(showStatusCallback, "完毕");
- tbMessage.Invoke(resetMessageCallback, null);
- lbMessageView.Invoke(showMessageCallback, state.ToString());
- }
- catch
- {
- if (reader != null)
- {
- reader.Close();
- }
- if (writer != null)
- {
- writer.Close();
- }
- if (tcpClient != null)
- {
- tcpClient.Close();
- }
- statusStrip1.Invoke(showStatusCallback, "断开了链接");
- }
- }
- //关闭
- private void btnClose_Click(object sender, EventArgs e)
- {
- this.Close();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.Net.Sockets;
- using System.Net;
- using System.IO;
- using System.Threading;
- namespace Tcp服务器
- {
- public partial class Form1 : Form
- {
- #region 变量
- private const int Port = 51388;
- private TcpListener tcpListener = null;
- private TcpClient tcpClient = null;
- IPAddress ipaddress;
- private NetworkStream networkStream = null;
- private BinaryReader reader;
- private BinaryWriter writer;
- // 申明委托
- // 显示消息
- private delegate void ShowMessage(string str);
- private ShowMessage showMessageCallback;
- // 申明委托
- // 显示状态
- private delegate void ShowStatus(string str);
- private ShowStatus showStatusCallBack;
- // 申明委托
- // 清空消息
- private delegate void ResetMessage();
- private ResetMessage resetMessageCallBack;
- #endregion
- public Form1()
- {
- InitializeComponent();
- #region 实例化委托
- // 显示消息
- showMessageCallback = showMessage;
- // 显示状态
- showStatusCallBack = showStatus;
- // 重置消息
- resetMessageCallBack = resetMessage;
- #endregion
- ipaddress = IPAddress.Loopback;
- txtIP.Text = ipaddress.ToString();
- txtPort.Text = Port.ToString();
- }
- #region 定义回调函数
- // 显示消息
- private void showMessage(string str)
- {
- lbMessageView.Items.Add(tcpClient.Client.RemoteEndPoint);
- lbMessageView.Items.Add(str);
- lbMessageView.TopIndex = lbMessageView.Items.Count - 1;
- }
- // 显示状态
- private void showStatus(string str)
- {
- toolStripStatusLabel1.Text = str;
- }
- // 清空消息
- private void resetMessage()
- {
- tbMessage.Text = string.Empty;
- tbMessage.Focus();
- }
- #endregion
- //开始监听
- private void btnStart_Click(object sender, EventArgs e)
- {
- tcpListener = new TcpListener(ipaddress, Port);
- tcpListener.Start();
- //启动一个线程来接受请求
- Thread acceptThread = new Thread(acceptClientConnect);
- acceptThread.Start();
- }
- private void acceptClientConnect()
- {
- statusStrip1.Invoke(showStatusCallBack, "正在监听……");
- Thread.Sleep(1000);
- try
- {
- statusStrip1.Invoke(showStatusCallBack, "等待链接");
- tcpClient = tcpListener.AcceptTcpClient();
- if (tcpListener != null)
- {
- statusStrip1.Invoke(showStatusCallBack, "接受到链接");
- networkStream = tcpClient.GetStream();
- reader = new BinaryReader(networkStream);
- writer = new BinaryWriter(networkStream);
- }
- }
- catch
- {
- statusStrip1.Invoke(showStatusCallBack, "中止监听");
- Thread.Sleep(1000);
- statusStrip1.Invoke(showStatusCallBack, "就绪");
- }
- }
- //关闭监听
- private void btnStop_Click(object sender, EventArgs e)
- {
- tcpListener.Stop();
- }
- //接受
- private void btnReceiv_Click(object sender, EventArgs e)
- {
- statusStrip1.Invoke(showStatusCallBack, "接受消息中");
- try
- {
- string receivemessage = reader.ReadString();
- lbMessageView.Invoke(showMessageCallback, receivemessage);
- }
- catch
- {
- if (reader != null)
- {
- reader.Close();
- }
- if (writer != null)
- {
- writer.Close();
- }
- if (tcpClient != null)
- {
- tcpClient.Close();
- }
- statusStrip1.Invoke(showStatusCallBack, "断开了链接");
- Thread acceptThread = new Thread(acceptClientConnect);
- acceptThread.Start();
- }
- }
- //清空消息
- private void btnClear_Click(object sender, EventArgs e)
- {
- lbMessageView.Items.Clear();
- }
- //发送
- private void btnSend_Click(object sender, EventArgs e)
- {
- Thread sendThread = new Thread(SendMessage);
- sendThread.Start(tbMessage.Text);
- }
- private void SendMessage(object state)
- {
- statusStrip1.Invoke(showStatusCallBack, "正在发送");
- try
- {
- writer.Write(state.ToString());
- Thread.Sleep(3000);
- writer.Flush();
- statusStrip1.Invoke(showStatusCallBack, "完毕");
- tbMessage.Invoke(resetMessageCallBack, null);
- lbMessageView.Invoke(showMessageCallback, state.ToString());
- }
- catch
- {
- if (reader != null)
- {
- reader.Close();
- }
- if (writer != null)
- {
- writer.Close();
- }
- if (tcpClient != null)
- {
- tcpClient.Close();
- }
- statusStrip1.Invoke(showStatusCallBack, "断开了链接");
- // 从新开启一个线程等待新的链接
- Thread acceptThread = new Thread(acceptClientConnect);
- acceptThread.Start();
- }
- }
- //断开链接
- private void btnDispose_Click(object sender, EventArgs e)
- {
- if (reader != null)
- {
- reader.Close();
- }
- if (writer != null)
- {
- writer.Close();
- }
- if (tcpClient != null)
- {
- // 断开链接
- tcpClient.Close();
- }
- toolStripStatusLabel1.Text = "断开链接";
- // 启动一个线程等待接受新的请求
- Thread acceptThread = new Thread(acceptClientConnect);
- acceptThread.Start();
- }
- }
- }
进行通讯的时候,首先将TCP服务器端打开监听,客户端输入IP地址和端口号进行链接,链接成功后就能够进行通讯了网络