TCP通信
- 特点:面向连接、可靠通信。
- 通信双方事先会采用 “三次握手〞 方式建立可靠连接,实现端到端的通信;底层能保证数据成功传给服务端。
- Java提供了一个java.net.socket类来实现TCP通信。
TCP通信——客户端开发
- 客户端程序就是通过java.net包 下的Socket类来实现的。
代码演示如下:
public class Client { public static void main(String[] args) throws Exception{ System.out.println("客户端开启!"); //1.创建Socket对象,并同时请求与服务端程序的连接。 Socket socket = new Socket("127.0.0.1",8888); //2.从socket通信管道中得到一个字节输出流。用来发数据给服务端程序 OutputStream os = socket.getOutputStream(); //3.把低级的字节输出流包装成数据输出流 DataOutputStream dos = new DataOutputStream(os); //4.开始写数据出去了 dos.writeUTF("你好,Java!"); dos.close(); socket.close(); // 释放连接资源 } }
TCP通信——服务端的开发
- 服务端是通过java.net包 下的Serversocket类来实现的。
代码演示如下:
public class Server { public static void main(String[] args) throws Exception{ System.out.println("服务端开启!"); //1.创建ServerSocket的对象,同时为服务端注册端口。 ServerSocket serverSocket = new ServerSocket(8888); //2.使用serverSocket对象,嗲用一个accept方法,等待客户端的连接请求 Socket socket = serverSocket.accept(); //3.从socket通信管道中得到一个字节输入流 InputStream is = socket.getInputStream(); //4.把原始的字节输入流包装成数据输入流 DataInputStream dis = new DataInputStream(is); //5.使用数据输入流读取客户端发送过来的消息 String rs = dis.readUTF(); System.out.println(rs); //还可以获取客户端的IP地址 System.out.println(socket.getRemoteSocketAddress()); dis.close(); socket.close(); } }
实现多发多收,就要把代码改成循环。具体演示看下面部分代码:
客户端:
public class Client { public static void main(String[] args) throws Exception{ System.out.println("客户端开启!"); //1.创建Socket对象,并同时请求与服务端程序的连接。 Socket socket = new Socket("127.0.0.1",8888); //2.从socket通信管道中得到一个字节输出流。用来发数据给服务端程序 OutputStream os = socket.getOutputStream(); //3.把低级的字节输出流包装成数据输出流 DataOutputStream dos = new DataOutputStream(os); Scanner sc = new Scanner(System.in); while (true) { System.out.println("请输入:"); String msg = sc.nextLine(); //一旦用户输入了exit,就退出客户端程序 if ("exit".equals(msg)){ System.out.println("退出成功!"); dos.close(); socket.close(); break; } //4.开始写数据出去了 dos.writeUTF(msg); dos.flush(); } } }
服务端:
public class Server { public static void main(String[] args) throws Exception{ System.out.println("服务端开启!"); //1.创建ServerSocket的对象,同时为服务端注册端口。 ServerSocket serverSocket = new ServerSocket(8888); //2.使用serverSocket对象,嗲用一个accept方法,等待客户端的连接请求 Socket socket = serverSocket.accept(); //3.从socket通信管道中得到一个字节输入流 InputStream is = socket.getInputStream(); //4.把原始的字节输入流包装成数据输入流 DataInputStream dis = new DataInputStream(is); while (true) { try { //5.使用数据输入流读取客户端发送过来的消息 String rs = dis.readUTF(); System.out.println(rs); } catch (Exception e) { System.out.println(socket.getRemoteSocketAddress() + "离线了~"); dis.close(); socket.close(); } } } }