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();}}} }