TcpListner和TcpClient使用(同步)
服务端

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;
using System.Net.Sockets;
using System.IO;
using System.Threading;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
private static string serverIp = "127.0.0.1";
private static int serverPort = 8999;
private static TcpClient clientTcpClient;
private delegate void ShowMsg(string msg);
private ShowMsg showMsg;
private delegate void ShowStatusText(string text);
private ShowStatusText showStatusText;
private delegate void ShowProgress(int value);
private ShowProgress showProgress;
private BinaryReader br;
private BinaryWriter bw;
public Form1()
{
InitializeComponent();
try
{
showMsg = new ShowMsg(showMsgToView);
showStatusText = new ShowStatusText(setStatusToLabel);
showProgress = new ShowProgress(setStatusToProgress);
}
catch (Exception e)
{
handleError(e);
}
}
private void btnSendMsg_Click(object sender, EventArgs e)
{
try{
string msg = getMsgWhichSend();
if(msg.Length==0){
MessageBox.Show("不能发送空消息");
return;
}
ThreadPool.QueueUserWorkItem(new WaitCallback(sendMsg), msg);
}catch(Exception err){
handleError(err);
}
}
private void btnReceiveMsg_Click(object sender, EventArgs e)
{
try
{
ThreadPool.QueueUserWorkItem(new WaitCallback(receiveMsg));
}
catch (Exception err)
{
handleError(err);
}
}
private string getMsgWhichSend()
{
return rtbInputMsg.Text;
}
private void handleError(Exception e){
showStatusText("异常");
MessageBox.Show("发送错误:"+e.Message);
if (br != null)
{
br.Dispose();
br.Close();
}
if (bw != null)
{
bw.Dispose();
bw.Close();
}
if (clientTcpClient != null)
{
clientTcpClient.Close();
}
}
private void showMsgToView(string msg)
{
rtbShowMsg.AppendText(msg);
rtbShowMsg.ScrollToCaret();
}
private void setStatusToLabel(string status)
{
lblStatus.Text = status;
}
private void setStatusToProgress(int value)
{
progressBar.Value = value;
}
private void resetINput(){
rtbInputMsg.Clear();
}
private void sendMsg(object msg)
{
try{
if (clientTcpClient != null)
{
lblStatus.Invoke(showStatusText, "发送中");
progressBar.Invoke(showProgress, 1);
bw.Write(msg.ToString());
bw.Flush();
lblStatus.Invoke(showStatusText, "发送完毕");
progressBar.Invoke(showProgress, 100);
}
else
{
MessageBox.Show("没有客户端连接");
}
}
catch (Exception e)
{
handleError(e);
}
}
private void receiveMsg(object state)
{
try{
if (clientTcpClient != null)
{
lblStatus.Invoke(showStatusText, "接收中");
progressBar.Invoke(showProgress, 1);
string msg = br.ReadString();
rtbShowMsg.Invoke(showMsg, msg);
lblStatus.Invoke(showStatusText, "接收完毕");
progressBar.Invoke(showProgress, 100);
}
else
{
MessageBox.Show("请先创建连接");
}
}catch(Exception e){
handleError(e);
}
}
private void tslStart_Click(object sender, EventArgs e)
{
try
{
Thread startThread = new Thread(new ThreadStart(startListen));
startThread.Start();
}
catch (Exception err)
{
handleError(err);
}
}
private void startListen()
{
try
{
lblStatus.Invoke(showStatusText, "准备中");
progressBar.Invoke(showProgress, 1);
IPAddress serverIpAddress = IPAddress.Parse(serverIp);
TcpListener serverTcpListner = new TcpListener(serverIpAddress, serverPort);
serverTcpListner.Start();
lblStatus.Invoke(showStatusText, "准备就绪");
progressBar.Invoke(showProgress, 100);
clientTcpClient = serverTcpListner.AcceptTcpClient();
MessageBox.Show("客户端接入");
NetworkStream nStream = clientTcpClient.GetStream();
br = new BinaryReader(nStream);
bw = new BinaryWriter(nStream);
}
catch(Exception err)
{
handleError(err);
}
}
private void tslStop_Click(object sender, EventArgs e)
{
try
{
Thread stopThread = new Thread(new ThreadStart(stopConnect));
stopThread.Start();
}
catch (Exception err)
{
handleError(err);
}
}
private void stopConnect()
{
try
{
lblStatus.Invoke(showStatusText, "关闭中");
progressBar.Invoke(showProgress, 1);
if (br != null)
{
br.Dispose();
br.Close();
}
if (bw != null)
{
bw.Dispose();
bw.Close();
}
if (clientTcpClient != null)
{
clientTcpClient.Close();
}
lblStatus.Invoke(showStatusText, "完毕");
progressBar.Invoke(showProgress, 100);
}
catch (Exception e)
{
handleError(e);
}
}
}
}
客户端

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.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
private static string serverIp = "";
private static int serverPort = -1;
private static TcpClient clientTcpClient;
private delegate void ShowMsg(string msg);
private ShowMsg showMsg;
private delegate void ShowStatusText(string text);
private ShowStatusText showStatusText;
private delegate void ShowProgress(int value);
private ShowProgress showProgress;
private BinaryReader br;
private BinaryWriter bw;
public Form1()
{
InitializeComponent();
try
{
showMsg = new ShowMsg(showMsgToView);
showStatusText = new ShowStatusText(setStatusToLabel);
showProgress = new ShowProgress(setStatusToProgress);
}
catch (Exception e)
{
handleError(e);
}
}
private void btnConnect_Click(object sender, EventArgs e)
{
serverIp = txtIp.Text;
if (serverIp==null||"".Equals(serverIp.Trim()))
{
MessageBox.Show("请输入ip地址");
return;
}
if (serverPort == null)
{
MessageBox.Show("请输入端口号");
return;
}
else
{
try
{
serverPort = int.Parse(txtport.Text);
}
catch (Exception err)
{
MessageBox.Show("请输入正确的端口号");
return;
}
}
try
{
Thread startThread = new Thread(new ThreadStart(startConnect));
startThread.Start();
}
catch (Exception err)
{
handleError(err);
}
}
private void startConnect()
{
try
{
lblStatus.Invoke(showStatusText, "连接中");
progressBar.Invoke(showProgress, 1);
clientTcpClient = new TcpClient();
clientTcpClient.Connect(serverIp, serverPort);
NetworkStream stream = clientTcpClient.GetStream();
br = new BinaryReader(stream);
bw = new BinaryWriter(stream);
lblStatus.Invoke(showStatusText, "连接成功");
progressBar.Invoke(showProgress, 100);
}
catch (Exception err)
{
handleError(err);
}
}
private void sendMsg(object msg)
{
try
{
lblStatus.Invoke(showStatusText, "发送中");
progressBar.Invoke(showProgress, 1);
bw.Write(msg.ToString());
bw.Flush();
lblStatus.Invoke(showStatusText, "发送完毕");
progressBar.Invoke(showProgress, 100);
}
catch (Exception e)
{
handleError(e);
}
}
private void receiveMsg(object state)
{
try
{
if (clientTcpClient != null)
{
lblStatus.Invoke(showStatusText, "接收中");
progressBar.Invoke(showProgress, 1);
string msg = br.ReadString();
rtbShowMsg.Invoke(showMsg, msg);
lblStatus.Invoke(showStatusText, "接收完毕");
progressBar.Invoke(showProgress, 100);
}
else
{
MessageBox.Show("请先创建连接");
}
}
catch (Exception e)
{
handleError(e);
}
}
private void handleError(Exception e)
{
showStatusText("异常");
MessageBox.Show("发送错误:" + e.Message);
if (br != null)
{
br.Dispose();
br.Close();
}
if (bw != null)
{
bw.Dispose();
bw.Close();
}
if (clientTcpClient != null)
{
clientTcpClient.Close();
}
}
private void showMsgToView(string msg)
{
rtbShowMsg.AppendText(msg);
rtbShowMsg.ScrollToCaret();
}
private void setStatusToLabel(string status)
{
lblStatus.Text = status;
}
private void setStatusToProgress(int value)
{
progressBar.Value = value;
}
private void resetINput()
{
rtbInputMsg.Clear();
}
private void btnSendMsg_Click(object sender, EventArgs e)
{
try
{
string msg = getMsgWhichSend();
if (msg.Length == 0)
{
MessageBox.Show("不能发送空消息");
return;
}
ThreadPool.QueueUserWorkItem(new WaitCallback(sendMsg),msg);
}
catch (Exception err)
{
handleError(err);
}
}
private void sendMsg(String msg)
{
try
{
if (clientTcpClient != null)
{
lblStatus.Invoke(showStatusText, "发送中");
progressBar.Invoke(showProgress, 1);
bw.Write(msg.ToString());
bw.Flush();
lblStatus.Invoke(showStatusText, "发送完毕");
progressBar.Invoke(showProgress, 100);
}
else
{
MessageBox.Show("请先建立连接");
}
}
catch (Exception e)
{
handleError(e);
}
}
private void receiveMsg()
{
try
{
if (clientTcpClient != null)
{
string msg = br.ReadString();
MessageBox.Show(msg);
}
else
{
MessageBox.Show("请先创建连接");
}
}
catch (Exception e)
{
handleError(e);
}
}
private void btnReceiveMsg_Click(object sender, EventArgs e)
{
try
{
ThreadPool.QueueUserWorkItem(new WaitCallback(receiveMsg));
}
catch (Exception err)
{
handleError(err);
}
}
private string getMsgWhichSend()
{
return rtbInputMsg.Text;
}
private void btnDisConnect_Click(object sender, EventArgs e)
{
lblStatus.Invoke(showStatusText, "正在断开");
progressBar.Invoke(showProgress, 1);
if (br != null)
{
br.Dispose();
br.Close();
}
if (bw != null)
{
bw.Dispose();
bw.Close();
}
if (clientTcpClient != null)
{
clientTcpClient.Close();
}
lblStatus.Invoke(showStatusText, "未连接");
progressBar.Invoke(showProgress, 100);
}
}
}
TcpListner和TcpClient使用(异步)
服务端
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;
using System.Net.Sockets;
using System.IO;
using System.Threading;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
private static string serverIp = "127.0.0.1";
private static int serverPort = 8999;
private static TcpClient clientTcpClient;
private static TcpListener serverTcpListner;
private delegate void ShowMsg(string msg);
private ShowMsg showMsg;
private delegate void ShowStatusText(string text);
private ShowStatusText showStatusText;
private delegate void ShowProgress(int value);
private ShowProgress showProgress;
private delegate void ReceiveMsgDelegate(out string msg);
private ReceiveMsgDelegate receiveMsgDelegate;
private delegate void SendMsgDelegate(string msg);
private SendMsgDelegate sendMsgDelegate;
private BinaryReader br;
private BinaryWriter bw;
public Form1()
{
InitializeComponent();
try
{
showMsg = new ShowMsg(showMsgToView);
showStatusText = new ShowStatusText(setStatusToLabel);
showProgress = new ShowProgress(setStatusToProgress);
receiveMsgDelegate = new ReceiveMsgDelegate(asyncRecvMsg);
sendMsgDelegate = new SendMsgDelegate(asyncSendMsg);
}
catch (Exception e)
{
handleError(e);
}
}
private void btnSendMsg_Click(object sender, EventArgs e)
{
try{
string msg = getMsgWhichSend();
if(msg.Length==0){
MessageBox.Show("不能发送空消息");
return;
}
ThreadPool.QueueUserWorkItem(new WaitCallback(sendMsg), msg);
}catch(Exception err){
handleError(err);
}
}
private void btnReceiveMsg_Click(object sender, EventArgs e)
{
try
{
ThreadPool.QueueUserWorkItem(new WaitCallback(receiveMsg));
}
catch (Exception err)
{
handleError(err);
}
}
private void asyncRecvMsg(out string msg)
{
msg = null;
if(br!=null)
{
msg = br.ReadString();
}
}
private void asyncSendMsg(string msg)
{
if (bw != null)
{
bw.Write(msg);
}
}
private string getMsgWhichSend()
{
return rtbInputMsg.Text;
}
private void handleError(Exception e){
showStatusText("异常");
MessageBox.Show("发送错误:"+e.Message);
if (br != null)
{
br.Dispose();
br.Close();
}
if (bw != null)
{
bw.Dispose();
bw.Close();
}
if (clientTcpClient != null)
{
clientTcpClient.Close();
}
}
private void showMsgToView(string msg)
{
rtbShowMsg.AppendText(msg);
rtbShowMsg.ScrollToCaret();
}
private void setStatusToLabel(string status)
{
lblStatus.Text = status;
}
private void setStatusToProgress(int value)
{
progressBar.Value = value;
}
private void resetINput(){
rtbInputMsg.Clear();
}
private void sendMsg(object msg)
{
try{
if (clientTcpClient != null)
{
lblStatus.Invoke(showStatusText, "发送中");
progressBar.Invoke(showProgress, 1);
IAsyncResult result = sendMsgDelegate.BeginInvoke(msg.ToString(), null, null);
while (result.IsCompleted == false)
{
Thread.Sleep(500);
}
sendMsgDelegate.EndInvoke(result);
lblStatus.Invoke(showStatusText, "发送完毕");
progressBar.Invoke(showProgress, 100);
}
else
{
MessageBox.Show("没有客户端连接");
}
}
catch (Exception e)
{
handleError(e);
}
}
private void receiveMsg(object state)
{
try{
if (clientTcpClient != null)
{
lblStatus.Invoke(showStatusText, "接收中");
progressBar.Invoke(showProgress, 1);
string msg = null ;
IAsyncResult result = receiveMsgDelegate.BeginInvoke(out msg, null, null);
while (result.IsCompleted == false)
{
int j = 20;
j += 20;
if (j == 100) j = 10;
progressBar.Invoke(showProgress, j);
Thread.Sleep(500);
}
receiveMsgDelegate.EndInvoke(out msg, result);
if (msg != null)
{
rtbShowMsg.Invoke(showMsg, msg);
lblStatus.Invoke(showStatusText, "接收完毕");
progressBar.Invoke(showProgress, 100);
}
else
{
rtbShowMsg.Invoke(showMsg, msg);
lblStatus.Invoke(showStatusText, "接收失败");
progressBar.Invoke(showProgress, 0);
}
}
else
{
MessageBox.Show("请先创建连接");
}
}catch(Exception e){
handleError(e);
}
}
private void tslStart_Click(object sender, EventArgs e)
{
try
{
Thread startThread = new Thread(new ThreadStart(startListen));
startThread.Start();
}
catch (Exception err)
{
handleError(err);
}
}
private void startListen()
{
try
{
}
catch(Exception err)
{
handleError(err);
}
AsyncCallback acceptCallBack = new AsyncCallback(acceptClientConnect);
serverTcpListner = new TcpListener(IPAddress.Parse(serverIp), serverPort);
serverTcpListner.Start();
lblStatus.Invoke(showStatusText, "准备中");
progressBar.Invoke(showProgress, 1);
IAsyncResult result = serverTcpListner.BeginAcceptTcpClient(acceptCallBack, serverTcpListner);
lblStatus.Invoke(showStatusText, "准备就绪");
progressBar.Invoke(showProgress, 100);
}
private void acceptClientConnect(IAsyncResult iar)
{
MessageBox.Show("进入处理了");
serverTcpListner = (TcpListener)iar.AsyncState;
clientTcpClient = serverTcpListner.EndAcceptTcpClient(iar);
if (clientTcpClient != null)
{
NetworkStream stream = clientTcpClient.GetStream();
br = new BinaryReader(stream);
bw = new BinaryWriter(stream);
lblStatus.Invoke(showStatusText, "已被连接");
progressBar.Invoke(showProgress, 100);
}
else
{
lblStatus.Invoke(showStatusText, "连接异常");
progressBar.Invoke(showProgress, 100);
}
}
private void tslStop_Click(object sender, EventArgs e)
{
try
{
Thread stopThread = new Thread(new ThreadStart(stopConnect));
stopThread.Start();
}
catch (Exception err)
{
handleError(err);
}
}
private void stopConnect()
{
try
{
lblStatus.Invoke(showStatusText, "关闭中");
progressBar.Invoke(showProgress, 1);
if (br != null)
{
br.Dispose();
br.Close();
}
if (bw != null)
{
bw.Dispose();
bw.Close();
}
if (clientTcpClient != null)
{
clientTcpClient.Close();
}
lblStatus.Invoke(showStatusText, "完毕");
progressBar.Invoke(showProgress, 100);
}
catch (Exception e)
{
handleError(e);
}
}
}
}
客户端
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.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
private static string serverIp = "";
private static int serverPort = -1;
private static TcpClient clientTcpClient;
private delegate void ShowMsg(string msg);
private ShowMsg showMsg;
private delegate void ShowStatusText(string text);
private ShowStatusText showStatusText;
private delegate void ShowProgress(int value);
private ShowProgress showProgress;
private delegate void ReceiveMsgDelegate(out string msg);
private ReceiveMsgDelegate receiveMsgDelegate;
private delegate void SendMsgDelegate(string msg);
private SendMsgDelegate sendMsgDelegate;
private BinaryReader br;
private BinaryWriter bw;
public Form1()
{
InitializeComponent();
try
{
showMsg = new ShowMsg(showMsgToView);
showStatusText = new ShowStatusText(setStatusToLabel);
showProgress = new ShowProgress(setStatusToProgress);
receiveMsgDelegate = new ReceiveMsgDelegate(asyncRecvMsg);
sendMsgDelegate = new SendMsgDelegate(asyncSendMsg);
}
catch (Exception e)
{
handleError(e);
}
}
private void asyncRecvMsg(out string msg)
{
msg = null;
if (br != null)
{
msg = br.ReadString();
}
}
private void asyncSendMsg(string msg)
{
if (bw != null)
{
bw.Write(msg);
}
}
private void btnConnect_Click(object sender, EventArgs e)
{
serverIp = txtIp.Text;
if (serverIp==null||"".Equals(serverIp.Trim()))
{
MessageBox.Show("请输入ip地址");
return;
}
if (serverPort == null)
{
MessageBox.Show("请输入端口号");
return;
}
else
{
try
{
serverPort = int.Parse(txtport.Text);
}
catch (Exception err)
{
MessageBox.Show("请输入正确的端口号");
return;
}
}
try
{
Thread startThread = new Thread(new ThreadStart(startConnect));
startThread.Start();
}
catch (Exception err)
{
handleError(err);
}
}
private void startConnect()
{
try
{
lblStatus.Invoke(showStatusText, "连接中");
progressBar.Invoke(showProgress, 1);
AsyncCallback asyncCallBack = new AsyncCallback(asyncConnectCallback);
clientTcpClient = new TcpClient();
clientTcpClient.BeginConnect(IPAddress.Parse(serverIp), serverPort, asyncCallBack,clientTcpClient);
}
catch (Exception err)
{
handleError(err);
}
}
private void asyncConnectCallback(IAsyncResult iar)
{
try
{
}
catch (Exception e)
{
}
clientTcpClient = (TcpClient)iar.AsyncState;
clientTcpClient.EndConnect(iar);
NetworkStream stream = clientTcpClient.GetStream();
br = new BinaryReader(stream);
bw = new BinaryWriter(stream);
lblStatus.Invoke(showStatusText, "连接成功");
progressBar.Invoke(showProgress, 100);
}
private void sendMsg(object msg)
{
try
{
if (clientTcpClient != null)
{
lblStatus.Invoke(showStatusText, "发送中");
progressBar.Invoke(showProgress, 1);
IAsyncResult result = sendMsgDelegate.BeginInvoke(msg.ToString(), null, null);
while (result.IsCompleted == false)
{
Thread.Sleep(500);
}
sendMsgDelegate.EndInvoke(result);
lblStatus.Invoke(showStatusText, "发送完毕");
progressBar.Invoke(showProgress, 100);
}
else
{
MessageBox.Show("没有客户端连接");
}
}
catch (Exception e)
{
handleError(e);
}
}
private void receiveMsg(object state)
{
try
{
if (clientTcpClient != null)
{
lblStatus.Invoke(showStatusText, "接收中");
progressBar.Invoke(showProgress, 1);
string msg = null;
IAsyncResult result = receiveMsgDelegate.BeginInvoke(out msg, null, null);
while (result.IsCompleted == false)
{
int j = 20;
j += 20;
if (j == 100) j = 10;
progressBar.Invoke(showProgress, j);
Thread.Sleep(500);
}
receiveMsgDelegate.EndInvoke(out msg, result);
if (msg != null)
{
rtbShowMsg.Invoke(showMsg, msg);
lblStatus.Invoke(showStatusText, "接收完毕");
progressBar.Invoke(showProgress, 100);
}
else
{
rtbShowMsg.Invoke(showMsg, msg);
lblStatus.Invoke(showStatusText, "接收失败");
progressBar.Invoke(showProgress, 0);
}
}
else
{
MessageBox.Show("请先创建连接");
}
}
catch (Exception e)
{
handleError(e);
}
}
private void handleError(Exception e)
{
showStatusText("异常");
MessageBox.Show("发送错误:" + e.Message);
if (br != null)
{
br.Dispose();
br.Close();
}
if (bw != null)
{
bw.Dispose();
bw.Close();
}
if (clientTcpClient != null)
{
clientTcpClient.Close();
}
}
private void showMsgToView(string msg)
{
rtbShowMsg.AppendText(msg);
rtbShowMsg.ScrollToCaret();
}
private void setStatusToLabel(string status)
{
lblStatus.Text = status;
}
private void setStatusToProgress(int value)
{
progressBar.Value = value;
}
private void resetINput()
{
rtbInputMsg.Clear();
}
private void btnSendMsg_Click(object sender, EventArgs e)
{
try
{
string msg = getMsgWhichSend();
if (msg.Length == 0)
{
MessageBox.Show("不能发送空消息");
return;
}
ThreadPool.QueueUserWorkItem(new WaitCallback(sendMsg),msg);
}
catch (Exception err)
{
handleError(err);
}
}
private void sendMsg(String msg)
{
try
{
if (clientTcpClient != null)
{
lblStatus.Invoke(showStatusText, "发送中");
progressBar.Invoke(showProgress, 1);
bw.Write(msg.ToString());
bw.Flush();
lblStatus.Invoke(showStatusText, "发送完毕");
progressBar.Invoke(showProgress, 100);
}
else
{
MessageBox.Show("请先建立连接");
}
}
catch (Exception e)
{
handleError(e);
}
}
private void receiveMsg()
{
try
{
if (clientTcpClient != null)
{
string msg = br.ReadString();
MessageBox.Show(msg);
}
else
{
MessageBox.Show("请先创建连接");
}
}
catch (Exception e)
{
handleError(e);
}
}
private void btnReceiveMsg_Click(object sender, EventArgs e)
{
try
{
ThreadPool.QueueUserWorkItem(new WaitCallback(receiveMsg));
}
catch (Exception err)
{
handleError(err);
}
}
private string getMsgWhichSend()
{
return rtbInputMsg.Text;
}
private void btnDisConnect_Click(object sender, EventArgs e)
{
lblStatus.Invoke(showStatusText, "正在断开");
progressBar.Invoke(showProgress, 1);
if (br != null)
{
br.Dispose();
br.Close();
}
if (bw != null)
{
bw.Dispose();
bw.Close();
}
if (clientTcpClient != null)
{
clientTcpClient.Close();
}
lblStatus.Invoke(showStatusText, "未连接");
progressBar.Invoke(showProgress, 100);
}
}
}