title: "TcpSocket"
date: 2019-07-22T19:19:50+08:00
本章内容为:《基于tcp完成Socket通信基础》
作者:nuoccc
首先我们来了解一下什么是TCP和UDP协议:
-
TCP协议:有连接协议,需要建立三次握手连接后才通讯,可以可靠的通讯,还可以处理数据出错的问题,因为有这些机制,所以通讯效率略低,但通讯是最可靠的。
Tcp实现的Socket通信是基于TCP三次握手,下面是TCP三次握手的流程图:
Socket1.png
基于Tcp三次握手,改进为客户机和服务器进行Socket通信,于是可以变为下图:
我们基于这个图来完成对Socket通信的编程:
首先我们需要创建一个对象对客户机端口进行监听:
ServerSocket serverSocket = new ServerSocket(8888);//里面放端口号,端口号一定要跟客户机通信端口一致
这里我们要了解什么是端口号,端口号可以这样理解:
因为我们一台电脑对应一个ip地址,如果只有一个ip地址我们的应用也会只是单一的,但我们电脑现在都是多任务系统,同时有多个应用会进行通信,于是产生了端口号来解决这个问题,实现多通信。数据的发送和接收都需要通过端口出入计算机,端口号用于唯一标识通信实体上进行网络通讯的程序,同一台机器上不能两个程序占用同一个端口。了解完端口号,我们继续来说程序。
然后创立一个Socket 对象来完成连接
Socket socket = serverSocket.accept();
完成好连接后就能进行数据的读写操作,我们用一个线程来完成这个步骤
SockertThread th = new SocketThread(socket);
然后创立好相应的线程类
class SocketThread extends Thread{
private Socket socket;
public SocketThread(){
}
public SocketThread(Socket socket){
this.socket=socket;
}
@Override
public void run(){
try{
InputStream in = socket.getInputStream();//获取当前对象socket来获取客户机的输入流
byte[] b = new byte[1024];
in.read(b)//这里假设数据小于1024,一次读完,也可以用while来读数据
String info = new String(b);//创建一个字符串来接受获得的信息
System.out.println("收到来自客户机的消息:"+info);//这样就完成从客户机读取数据。并向客户机传递一条信息.
OutputStream out = socket.getOutputStream();
out.write("你好,我是服务器".getBytes());
socket.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
这样服务器的程序我们就写好了,然后我们来写客户机程序
public class SocketClient {
public static void main(String[] args) {
try {
//Java提供了InetAddress类来代表ip地址,是对ip地址的抽取和封装,有两个子类:Inet4Address,Inet6Address,分别表示IPv4
// 和IPv6
//InetAddress.getByName("10.7.184.52")通过点分十进制字符串来产生IP地址,8888为端口号
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),8888);//你自己的网络地址,以及端口号
OutputStream out = socket.getOutputStream();//向服务器发送消息
out.write("你好,我是客户机".getBytes());
InputStream in =socket.getInputStream();
byte[] buf = new byte[1024];
int len=0;
in.read(buf);
String info = new String(buf);
System.out.println("收到来自服务器的信息"+info);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我们最后用控制台模拟一台服务机一台客户机,来看看输出打印:
这就完成了基于TCP的Socket通信。