C#服务端与客户端使用Socket TCP通信
服务端
TCPCSServer.cs 代码
using System;
using System.Net.Sockets;
using System.Net;
using TCPCSServer.Message;
namespace TCPCSServer
{
class TCPCSServer
{
//服务器端IP地址与端口
private static String localIPAddress = "192.168.1.9";
private static int localIPPoint = 18888;
//接收客户端消息的数据流大小
private static int dataBufferSize = 258;
static void Main(string[] args)
{
Console.WriteLine("Tcp Socket ——服务器端");
StartServerAsync();
Console.ReadLine();
}
static byte[] dataBuffer = new byte[dataBufferSize];
private static Socket serverSocket = null;//服务端Socket
static void StartServerAsync()
{
CreatServerSocket();//创建服务器端Socket
serverSocket.BeginAccept(AcceptCallBack, serverSocket);
}
static void CreatServerSocket()
{
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress iPAddress = IPAddress.Parse(localIPAddress);
IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, localIPPoint);
serverSocket.Bind(iPEndPoint);//绑定ip与端口号
serverSocket.Listen(0);//开始监听端口号
}
static void AcceptCallBack(IAsyncResult asyncResult)
{
Socket newserverSocket = null;
Socket clientSocket = null;
try
{
newserverSocket = asyncResult.AsyncState as Socket;
clientSocket = newserverSocket.EndAccept(asyncResult);
}catch(Exception e)
{
Console.WriteLine(e.ToString());
if (clientSocket != null)
{
clientSocket.Close();
}
StartServerAsync();
return ;
}
//向客户端发送一条消息
string msg = "Hello client,connect to server success...";
byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
clientSocket.Send(data);
BeginReceiveFunc(clientSocket);
serverSocket.BeginAccept(AcceptCallBack, serverSocket);
}
//使用Message类的成员变量与方法
static MessageClass message = new MessageClass();
static void ReceiveCallBack(IAsyncResult asyncResult)
{
Socket clientSocket = null;
try
{
clientSocket = asyncResult.AsyncState as Socket;
int count = clientSocket.EndReceive(asyncResult);
if (count == 0)
{
clientSocket.Close();
return;
}
message.AddCountAndReadMess(message,count);
//string msgReceive = Encoding.UTF8.GetString(dataBuffer, 0, count);
//Console.WriteLine("receive from client({0}):{1}", count, msgReceive);
BeginReceiveFunc(clientSocket);
}catch(Exception e)
{
Console.WriteLine(e.ToString());
if (clientSocket != null)
{
clientSocket.Close();
serverSocket.Close();
}
}
}
static void BeginReceiveFunc(Socket clientSocket)
{
clientSocket.BeginReceive(message.Data, message.StartIndex, message.RemainSize, SocketFlags.None, ReceiveCallBack, clientSocket);
}
}
}
客户端
TCPCSClient.cs 代码
using System;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace TCPCSClient
{
class TCPCSClient
{
//服务器端IP地址与端口
private static String localIPAddress = "192.168.1.9";
private static int localIPPoint = 18888;
//接收客户端消息的数据流大小
private static int dataBufferSize = 258;
private static bool openPort = false;//服务器服务与端口是否开启
private static bool isFirstConnect = false;
private static bool firstConnectFlag = true;
static void Main(string[] args)
{
Console.WriteLine("Tcp Socket ——客户端");
Console.WriteLine("---请在下方输入要发送的内容,输入quit退出连接---");
ConnectSocket();
Console.ReadLine();
}
private static Socket ConnectSocket()
{
Socket newClientSocket = null;
try
{
newClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
newClientSocket.Connect(new IPEndPoint(IPAddress.Parse(localIPAddress), localIPPoint));
ReceiveCallback(newClientSocket);
openPort = true;
}
catch (Exception e)
{
Console.WriteLine("远程服务未开启,请稍后再试...\n{0}", e.ToString());
openPort = false;
}
while (true)
{
string strSend = Console.ReadLine();
if (strSend.Equals("quit")) break;
else if (strSend.Equals("connect"))ConnectSocket();
try
{
if (openPort)
{
newClientSocket.Send(Encoding.UTF8.GetBytes(strSend));
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
newClientSocket.Close();
}
}
newClientSocket.Close();
return null;
}
private static void ReceiveCallback(Socket newClientSocket)
{
if (firstConnectFlag)
{
isFirstConnect = true;
firstConnectFlag = false;
}
//从服务端接收数据
if (isFirstConnect)
{
try
{
byte[] data = new byte[dataBufferSize];
int count = newClientSocket.Receive(data);
string msgReceive = Encoding.UTF8.GetString(data, 0, count);
Console.WriteLine("receive form server({0}):{1}", count, msgReceive);
isFirstConnect = false;
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
}
}
}
中间件Message
TCPCSServer1/Message.cs 代码
using System;
using System.Text;
namespace TCPCSServer1.Message
{
class MessageClass
{
private static int bufferSize = 10;
private byte[] data = new byte[bufferSize];//消息数据缓存流大小
private int startIndex = 0;//在数组中即将存取数据的位置
private int remainSize = bufferSize;
private int arrayMessHead = 4;
public void AddCount(int count)
{
startIndex += count;
}
public byte[] Data
{
get { return data; }
set
{
data = value;
}
}
public int StartIndex
{
get { return startIndex; }
set
{
startIndex += value;
}
}
public int RemainSize
{
get
{
return remainSize -= startIndex;
}
}
public void ReadMessageServer(int amount)
{
Console.WriteLine("startIndex:{0},count:{1}", startIndex,amount);
string count = Convert.ToString(amount);
while (true)
{
if (startIndex <= 0) break;
if(true)
//if ((startIndex - 4) >= count)
{
string strMess = Encoding.UTF8.GetString(data, 0, amount);
Console.WriteLine("解析前的数据:{0}", strMess);
string mess = String.Concat(count,strMess);
Console.WriteLine("解析后的数据:{0}", mess);
startIndex -= amount;
}
else
{
break;
}
}
}
public void AddCountAndReadMess(MessageClass message,int count)
{
message.AddCount(count);
message.ReadMessageServer(count);
}
public void ReadMessage()
{
Console.WriteLine("startIndex:{0}--remainSize:{1}",startIndex, remainSize);
}
}
}