C# TCP客户端与TCP服务器端源码

下面是C#TCP通讯源码,TCP服务器端支持多链接。直接复制粘贴就可以使用,也可以参考第99集的视频教程。

C# TCP客户端与TCP服务器端源码

//添加的命名空间

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.IO.Ports;

using System.Threading;

using System.Windows.Forms;

using System.Collections;

using System.Net;

using System.Net.Sockets;

using System.Net.NetworkInformation;

namespace PCHMI

{

public class TCPServer

{

public delegate void RD(NetworkStream NS, byte[] recvBytes);

public event RD RECV;

int PORT = 5000;

string IP = "127.0.0.1";

private ThreadStart start;

private Thread listenThread;

public TCPServer(string ip, int port, RD recv)

{

RECV = recv;

IP = ip;

PORT = port;

start = new ThreadStart(startListen);

listenThread = new Thread(start);

listenThread.Start();

}

public Socket tempSocket;

int ConNumber = 0;

private void startListen()

{

while (true)

{

try

{

//绑定端口

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(IP), PORT);

Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

newsock.Bind(ipep);

newsock.Listen(10);

while (true)

{

//等待TCP客户端的链接请求

Socket client = newsock.Accept();

tempSocket = client;

Thread clientService = new Thread(new ThreadStart(ServiceClient));

clientService.IsBackground = true;

clientService.Start();

}

}

catch {Thread.Sleep(2000); ConNumber++; }

}

}

public void ServiceClient()

{

IPEndPoint newclient = (IPEndPoint)this.tempSocket.RemoteEndPoint;

NetworkStream ns = new NetworkStream(tempSocket);

byte[] myReadBuffer = new byte[2048];

int count;

while (true)

{

try

{

//读取数据

count = ns.Read(myReadBuffer, 0, myReadBuffer.Length);

if (count > 0)

{

byte[] rebyte = new byte[count];

for (int i = 0; i < count; i++) { rebyte[i] = (byte)myReadBuffer[i]; }


if (RECV != null) { RECV(ns, rebyte); }

}

else { break; }

}

catch { break; }

}

ns.Close();

}

}

public class TCPClient

{

string IP = "127.0.0.1";

int Port = 102;

bool OutTime = true;

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

public TCPClient(string ip, int port)

{

IP = ip;

Port = port;

}

public byte[] TSEND(byte[] WDT)

{

//采用的同步通讯方式。

//IP,PORT,功能码,起始地址,地址长度

try

{

byte[] data = new byte[500];

if (OutTime)

{

OutTime = false;

socket = new TimeOutSocket().Connect(IP, Port, 1000);

socket.SendTimeout = 1000;

socket.ReceiveTimeout = 1000;

}

socket.BeginSend(WDT, 0, WDT.Length, SocketFlags.None, null, null);

var length = socket.Receive(data);

byte[] DT = new byte[length];

Array.Copy(data, 0, DT, 0, DT.Length);

return DT;

}

catch (Exception ex)

{

socket.Dispose();

OutTime = true;

Thread.Sleep(2000);

}

return null;

}

}

}

【下面是调用实例】

private void Form1_Load(object sender, EventArgs e)

{

//添加启动代码

config1.START((Control)this, System.Reflection.Assembly.GetExecutingAssembly(), null);

//在LOAD事件里配置TCP服务

new PCHMI.TCPServer("127.0.0.1", 7800, RECV);

}

//回调函数,用来处理客户端发来的信息

public void RECV(NetworkStream NS, byte[] recvBytes)

{

//将接收到客户端发来的信息显示出来

this.BeginInvoke(new System.EventHandler(UpdateUI), Encoding.Default.GetString(recvBytes));

//要返回的内容

Byte[] RDT = Encoding.Default.GetBytes("收到");

//发送给客户端

NS.Write(RDT, 0, RDT.Length);

}

//将服务器接收到客户端的信息显示出来

private void UpdateUI(object o, System.EventArgs e) { TBox1.Text += o.ToString() + "\r "; }

//声明一个TCP客户端链接

PCHMI.TCPClient TCPC = new PCHMI.TCPClient("127.0.0.1", 7800);

private void 发送按钮_Click(object sender, EventArgs e)

{

//向服务器发送数据,并将返回的数据放到数组里。

Byte[] RDT = TCPC.TSEND(Encoding.Default.GetBytes("HELLO"));

TBox2.Text += Encoding.Default.GetString(RDT) + "\r ";

}

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章