服务器端:在服务器端,创建一个ServerSocket对象,并指定一个端号,使用ServerSocket类的accept()方法使服务器处于阻塞状态,等待用户请求。
接收:
创建TCP服务端的Socket对象
监听客户端对象
获取输入流,读取数据
释放资源
客户端:通过指定一个InetAddress对象和一个端口号,创建一个Socket对象,通过这个对象,连接到服务器。
发送:
创建TCP客户端的Socket对象
获取输出流,写数据
释放资源
代码如下:
服务端
public class Server { public static void main(String args[]) { Scanner sc = new Scanner(System.in); DataOutputStream dos = null; DataInputStream dis = null; try { ServerSocket ss = new ServerSocket(8888); //监听客户端的连接,socket就代表和客户端的连接 Socket socket = ss.accept(); new MessageThread(socket).start(); //获取客户端的ip地址对象 //打开输出流,向客户端输出信息 dos = new DataOutputStream(socket.getOutputStream()); System.out.println("请输入您想说的话:"); String s = sc.nextLine(); while(!s.equals("bye")) { dos.writeUTF(s); System.out.println("请输入您想说的话:"); s = sc.nextLine(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { dos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private static class MessageThread extends Thread { Socket socket; public MessageThread(Socket socket) { this.socket = socket; } public void run() { DataInputStream dis = null; try { dis = new DataInputStream(socket.getInputStream()); String s = dis.readUTF(); while(true) { System.out.println("client:" + s); if(s.equals("bye")) { break; } s = dis.readUTF(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { dis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
客户端:
public class Client { public static void main(String args[]) { Scanner sc = new Scanner(System.in); DataOutputStream dos = null; //指定Ip地址和端口,和服务器建立连接 try { Socket socket = new Socket("127.0.0.1", 8888); new MessageThread(socket).start(); //打开输出流,向服务端输出信息 dos = new DataOutputStream(socket.getOutputStream()); System.out.println("请输入您想说的话:"); String s = sc.nextLine(); while(!s.equals("bye")) { dos.writeUTF(s); System.out.println("请输入您想说的话:"); s = sc.nextLine(); } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { dos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private static class MessageThread extends Thread { Socket socket; public MessageThread(Socket socket) { this.socket = socket; } public void run() { DataInputStream dis = null; try { dis = new DataInputStream(socket.getInputStream()); String s = dis.readUTF(); while(true) { System.out.println("server:" + s); if(s.equals("bye")) { break; } s = dis.readUTF(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { dis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
通过使用线程实现了双向通信。
原文链接:https://blog.csdn.net/qq_42383970/article/details/80736377
文章评论