服务器端通过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(); } }