Java中Socket通信的建立与字节流传输

    xiaoxiao2025-02-19  36

    文章目录

    Socket通信本机中模拟服务端和客服端进行Socket通信本机和同一局域网下的客户机进行Socket通信本机和远程的服务器进行Socket通信

    Socket通信

    这两天熟悉了一下Java中的Socket通信,没有深入太多,主要是熟悉连接的建立和字节流的传输。

    本机中模拟服务端及客户端建立Socket连接本机和同一局域网下的一台客户机建立Socket连接本机和远程的服务器建立Socket连接

    测试用的Java代码都比较简单,代码基本一样,只是IP的地方不同,所以只贴一份代码。


    ServerSocket的构造方法有四种

    1 public ServerSocket(int port) throws IOException 创建绑定到特定端口的服务器套接字。 2 public ServerSocket(int port, int backlog) throws IOException 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。 3 public ServerSocket(int port, int backlog, InetAddress address) throws IOException 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。 4 public ServerSocket() throws IOException 创建非绑定服务器套接字。

    Socket的构造方法有五种

    1 public Socket(String host, int port) throws UnknownHostException, IOException. 创建一个流套接字并将其连接到指定主机上的指定端口号。 2 public Socket(InetAddress host, int port) throws IOException 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 3 public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. 创建一个套接字并将其连接到指定远程主机上的指定远程端口。 4 public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. 创建一个套接字并将其连接到指定远程地址上的指定远程端口。 5 public Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字

    本机中模拟服务端和客服端进行Socket通信

    服务端:

    public class ServerOfSocket { /** * socket用户链表 */ private static ArrayList<Socket> socketList = new ArrayList<Socket>(); public ServerOfSocket(int port){ Socket socket = null; String ip = null; try { ServerSocket serverSocket = new ServerSocket(port); System.out.println("服务器开启..."); while (true){ socket = serverSocket.accept(); System.err.println("收到连接"); socketList.add(socket); ip = socket.getInetAddress().getHostAddress(); System.err.println("IP为" + ip + "的用户上线了,当前共有" + socketList.size() + "人在线"); ServerResponseThread srt = new ServerResponseThread(socket,ip); srt.start(); } } catch (IOException e) { socketList.remove(socket); System.err.println(ip + " 已下线 , 当前在线人数为: " + socketList.size() + " 人 !"); } } public static ArrayList<Socket> getSocketList() { return socketList; } public static void main(String[] args) { new ServerOfSocket(7878); } }

    ServerResponseThread:

    public class ServerResponseThread extends Thread{ /** * 获取服务端当前所有的连接,用于当前线程输出信息 */ private ArrayList<Socket> socketList = ServerOfSocket.getSocketList(); /** * 当前线程的socket连接地址 */ private Socket socket = null; /** * 当前线程用户IP */ private String ip = null; /** * 构造方法创建线程 * @param socket 当前线程所归属的socket * @param ip 当前socket的IP地址 */ public ServerResponseThread(Socket socket,String ip){ this.socket = socket; this.ip = ip; } @Override public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (true){ String receiveInfo = null; if ((receiveInfo = br.readLine()) != null){ for (Socket s : socketList) { PrintWriter pw = new PrintWriter(s.getOutputStream()); pw.println(ip + ":" + receiveInfo); pw.flush(); } } } } catch (IOException e) { socketList.remove(socket); System.err.println("有用户下线,当前用户为" + socketList.size() + "人"); } } }

    客户端:

    public class ClientOfSocket { public ClientOfSocket(String address,int port){ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { Socket socket = new Socket(address,port); PrintWriter pw = new PrintWriter(socket.getOutputStream()); ClientRequestThread crt = new ClientRequestThread(socket); crt.start(); while (true){ String sendInfo = null; if ((sendInfo = br.readLine()) != null){ pw.println(sendInfo); pw.flush(); } } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { new ClientOfSocket("127.0.0.1",7878); } }

    ClientRequestThread:

    public class ClientRequestThread extends Thread{ private Socket socket; public ClientRequestThread(Socket socket){ this.socket = socket; } @Override public void run() { try { //服务端返回的数据 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (true){ //readline方法会有阻塞的情况 String returnInfo; if ((returnInfo = br.readLine()) != null){ System.out.println(returnInfo); } } } catch (IOException e) { e.printStackTrace(); } } }

    本机和同一局域网下的客户机进行Socket通信

        服务端的代码可以保持不变,因为默认使用本地的IP,如果有两个IP以上就可以使用InetAddress类设定IP。如果是单IP,只要给Socket设定端口就可以。     客户端也只需要更改服务器端的IP地址即可。

    本机和远程的服务器进行Socket通信

        我租用的是阿里云的轻量应用级服务器。     系统:CentOS     比如我现在用的是7878端口,那我就要先到阿里云的控制台,服务器 - 安全 - 防火墙,添加一个规则,把7878端口打开,对外开放,不然是无法建立Socket连接的。     如果服务器只有一个本地IP,那就不用改变服务器端的代码,默认使用这个IP,多IP就用InetAddress设定IP。 客户端只要改变目标服务机的IP地址即可。


    最新回复(0)