一,tcp协议
Tcp程序有服务器端和可客户端,服务器端通常在一个众所周知的地址监听对服务的请求,就是说服务器处于休眠状态,知道客户端对服务器提出了连接请求。
Server端程序执行步骤如下:
1.打开一个通信通道,并告知本地主机,他愿意在某一地址和端口上接收客户连接请求。
2.等待客户请求到达该端口。
3.接收到重复服务请求,处理该请求并发出应答信号。接收到并发服务请求,激活一个新的进程或者线程来处理这个客户请求。新进程或者线程处理此客户请求,并不需要对其他请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。
4.返回第二步,等待另一客户请求。
5.关闭服务器。
Client端程序执行步骤如下:
1.打开一个通信通道,并连接到服务器所在主机的特定端口。
2.向服务器发服务请求报文,等待并接受应答,继续提出请求。
3.请求结束后关闭通信通道并终止。
套接字工作原理:
1.服务器套接字监听全网
2.客户端套接字向服务端套接字发出连接请求。
3.当服务器端监听到客户端套接字的连接请求时,他就响应客户端套接字请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一点客户端确认了此描述,连接就建立好了。而服务器端始终处于监听状态,继续接受其他客户端套接字的连接请求。
使用socket实现tcp程序:
服务器端:
public Form1()
{
InitializeComponent();
//IPAddress监听所有地址
IPEndPoint localIPEndPoint = new IPEndPoint(IPAddress.Any, 6001);
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(localIPEndPoint);
serverSocket.Listen(10);
while (true)
{
//在accept处等待客户端的connect
clientSocket = serverSocket.Accept();
Thread receiveThread = new Thread(receiveData);
receiveThread.Start();
Thread sendThread = new Thread(sendData);
sendThread.Start();
}
}
private void sendData()
{
byte[] buffer = new byte[2];
buffer = Encoding.UTF8.GetBytes("owen");
clientSocket.Send(buffer,buffer.Length,SocketFlags.None);
}
private void receiveData()
{
byte[] buffer = new byte[2048];
//在receive处等待客户端发送信息过来
int len = clientSocket.Receive(buffer);
string message = Encoding.UTF8.GetString(buffer,0,len);
}客户端:
private Socket clientSocket;
public Form1()
{
InitializeComponent();
//这里的ipEndPoint是服务器端的ip和port
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("10.131.38.79"),6001);
clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//connect用于发起连接客户端
clientSocket.Connect(ipEndPoint);
Thread receiveThread = new Thread(receiveData);
receiveThread.Start();
Thread sendThread = new Thread(sendData);
sendThread.Start();
}
private void sendData()
{
//当这里发送了信息,服务端的receiveData就能接收信息
byte[] buffer = new byte[2048];
buffer = Encoding.UTF8.GetBytes("welcome");
clientSocket.Send(buffer, buffer.Length, SocketFlags.None);
}
private void receiveData()
{
byte[] buffer = new byte[2048];
int len = clientSocket.Receive(buffer);
string message = Encoding.UTF8.GetString(buffer, 0, len);
}另一种简便的Tcp编程方法——TcpListener和TcpClient
服务器端:
private NetworkStream netStream;
private TcpClient tcpClient;
private BinaryReader reader;
public Form1()
{
InitializeComponent();
TcpListener tcpListener = new TcpListener(IPAddress.Any, 13000);
tcpListener.Start();
while(true)
{
tcpClient = tcpListener.AcceptTcpClient();
Thread receiveThread = new Thread(receiveData);
receiveThread.Start();
//Thread sendThread = new Thread(sendData);
//sendThread.Start();
}
}
private void receiveData()
{
netStream = tcpClient.GetStream();
reader = new BinaryReader(netStream);
string receivemessage = reader.ReadString();
Console.WriteLine("message ="+receivemessage);
}
客户端:
private TcpClient tcpClient;
private NetworkStream netStream;
private BinaryWriter writer;
public Form1()
{
InitializeComponent();
tcpClient = new TcpClient();
tcpClient.Connect(IPAddress.Parse("10.131.38.79"), 13000);
Thread sendThread = new Thread(sendData);
sendThread.Start();
}
private void sendData()
{
netStream = tcpClient.GetStream();
writer = new BinaryWriter(netStream);
writer.Write("welcome");
}
755

被折叠的 条评论
为什么被折叠?



