服務器端通過ServerSocket實例監聽指定的端口,客戶端新建Socket實例,通過ip地址+端口號連接到指定的服務器,服務器端通過accept()方法與客戶端建立起socket通信。
下面是簡單的socket通信源碼(客戶端發消息,服務器端接收消息):
服務器端:
import java.io.DataInputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * Author:Z&J * E-mail: 320647879@qq.com * 版本:1.0 * 創建日期:2019/11/9 14:02 * 類描述-Description: * 服務器端需同時處理ServerSocket實例和Socket實例 * 服務端監聽一個端口,等待連接的到來。 */ public class TCPserver0 { private static final int port=55666;//指定監聽的端口 public static void main(String[] args) throws IOException { ServerSocket server=new ServerSocket(port);//ServerSocket實例監聽TCP連接請求 Socket socket=server.accept();//為每個請求創建新的Socket實例 DataInputStream in=new DataInputStream(socket.getInputStream());//獲得輸入流 System.out.println(in.readUTF());//顯示消息 } }
客戶端:
import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; /** * Author:Z&J * E-mail: 320647879@qq.com * 版本:1.0 * 創建日期:2019/11/9 13:51 * 類描述-Description: * 客戶端通過ip+端口,連接到指定的server */ public class TCPclient0 { private static final String host="localhost";//或者是127.0.0.1 private static final int port=55666;//服務器開放的端口 public static void main(String[] args) throws IOException { Socket client = new Socket(host,port);//與服務器建立連接 DataOutputStream out=new DataOutputStream(client.getOutputStream());//獲得輸出流 String message=new BufferedReader(new InputStreamReader(System.in)).readLine(); out.writeUTF(message);//發送輸入的信息 } }
上面的代碼只實現了簡單的客服端向服務器發消息,如何實現客服端與服務器能一直收發消息呢?由於發消息的同時也可以收消息,所以一個進程無法滿足要求,就需要引入線程,發消息和收消息用不同的線程來處理。
下面是簡單的客服端與服務器端互相收發消息的socket通信源碼:

import java.io.DataInputStream; import java.io.IOException; import java.net.Socket; /** * Author:Z&J * E-mail: 320647879@qq.com * 版本:1.0 * 創建日期:2019/11/14 13:53 * 類描述-Description: */ public class ReadThread implements Runnable { private DataInputStream in; private String message; public ReadThread(Socket socket) throws IOException { in=new DataInputStream(socket.getInputStream()); } @Override public void run() { while (true) { try { message=in.readUTF(); System.out.println(message); } catch (IOException e) { e.printStackTrace(); } } } }

import java.io.*; import java.net.Socket; /** * Author:Z&J * E-mail: 320647879@qq.com * 版本:1.0 * 創建日期:2019/11/14 13:56 * 類描述-Description: */ public class WriteThread implements Runnable { private DataOutputStream out; private String message; public WriteThread(Socket socket) throws IOException { out=new DataOutputStream(socket.getOutputStream()); } @Override public void run() { while (true) { try { message=new BufferedReader(new InputStreamReader(System.in)).readLine(); out.writeUTF(message);//發送輸入的信息 } catch (IOException e) { e.printStackTrace(); } } } }
服務器:
import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * Author:Z&J * E-mail: 320647879@qq.com * 版本:1.0 * 創建日期:2019/11/9 15:43 * 類描述-Description:服務器一直接收55666的端口號消息 */ public class TCPserver1 { private static final int port=55666;//指定監聽的本地端口 private ServerSocket server; private Socket client; public TCPserver1() throws IOException { server=new ServerSocket(port); while (true) { client=server.accept(); System.out.println(client.getRemoteSocketAddress()+"連接到服務器!"); Thread write=new Thread(new WriteThread(client)); write.start(); Thread read=new Thread(new ReadThread(client)); read.start(); } } public static void main(String[] args) throws IOException { new TCPserver1(); } }
客戶端:
import java.io.*; import java.net.Socket; /** * Author:Z&J * E-mail: 320647879@qq.com * 版本:1.0 * 創建日期:2019/11/9 15:52 * 類描述-Description:客戶端能一直發消息 */ public class TCPclient1 { private static final String host="localhost";//要連接的服務器的地址,這里是本地連接,也可以是127.0.0.1 private static final int port=55666;//服務器開放的端口 private Socket client; public TCPclient1() throws IOException { client=new Socket(host,port); System.out.println("連接到:"+client.getRemoteSocketAddress()+" 服務器"); Thread write=new Thread(new WriteThread(client)); write.start(); Thread read=new Thread(new ReadThread(client)); read.start(); } public static void main(String[] args) throws IOException { new TCPclient1(); } }