java Socket编程

一、socket简单客户端与服务端

客户端发送消息给服务端,服务端接收到消息后回应客户端。

客户端:

import java.io.*;
import java.net.Socket;

public class MainClient1 {
    public static void main(String[] args) {
        try {
            //设置发送到的ip和端口
            Socket socket = new Socket("127.0.0.1", 9999);
            //从socket获取输出流到缓冲写区,用来发送数据到服务端
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //获取Socket的输入流,用来接收从服务端发送过来的数据
            DataInputStream in = new DataInputStream(socket.getInputStream());

            //缓冲读区的内容写入缓冲写区,发送到服务端
            bufferedWriter.write("你好,我的第一个socket!");
            bufferedWriter.flush();
            socket.shutdownOutput();
            //获取服务端返回的数据
            System.out.println(in.readUTF());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务端:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class MainServer {
    public static void main(String[] args) {
        try {
            //服务端绑定端口
            ServerSocket serverSocket = new ServerSocket(9999);
            //获取客户端连接(accept是阻塞的,如果有多个客户端而服务端不用多线程会只获取第一个连接的客户端)
            Socket socket = serverSocket.accept();

            //获取Socket的输出流,用来向客户端发送数据
            DataOutputStream out = new DataOutputStream (socket.getOutputStream());
            //获取Socket的输入流,用来接收从客户端发送过来的数据
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));

            String str = reader.readLine();
            System.out.println("客户端发来的消息:"+str);
            //发送消息到对应的客户端
            out.writeUTF("服务端回复:已收到你的消息\"" + str+"\"");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

测试:
先启动服务端,再启动客户端。
在这里插入图片描述
在这里插入图片描述

二、socket客户端多次发送消息到服务端

客户端从键盘可多次发送消息给服务端,服务端接每次收到消息后回应客户端。

客户端:

import java.io.*;
import java.net.Socket;

public class MainClient1 {
    public static void main(String[] args) {
        try {
            //设置发送到的ip和端口
            Socket socket = new Socket("127.0.0.1", 9999);
            //从socket获取输出流到缓冲写区
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));

            //获取Socket的输入流,用来接收从服务端发送过来的数据
            DataInputStream in = new DataInputStream(socket.getInputStream());

            while (true) {
                //获取键盘输入的内容到缓冲读区
                bufferedWriter.write(bufferedReader.readLine());
                bufferedWriter.write("\n");
                bufferedWriter.flush();

                //获取服务端返回的数据
                System.out.println(in.readUTF());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class MainServer {
    public static void main(String[] args) {
        try {
            //服务端绑定端口
            ServerSocket serverSocket = new ServerSocket(9999);
            //获取客户端连接
            Socket socket = serverSocket.accept();
            //获取Socket的输出流,用来向客户端发送数据
            DataOutputStream out = new DataOutputStream (socket.getOutputStream());
            //获取Socket的输入流,用来接收从客户端发送过来的数据
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
            String str ;
            while ((str = reader.readLine()) != null) {
                //输出打印
                System.out.println("客户端发来的消息:"+str);
                //发送消息到对应的客户端
                out.writeUTF("服务端回复:已收到你的消息\"" + str+"\"");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

测试:
先启动服务端,再启动客户端,客户端可多次输入消息。
在这里插入图片描述

在这里插入图片描述

三、socket多客户端多次发送消息到服务端

上面的例子是一个客户端对应一个服务端,下面采用多线程对多个客户端对应一个服务端进行示例说明。

客户端1:

import java.io.*;
import java.net.Socket;

public class MainClient1 {
    public static void main(String[] args) {
        try {
            //设置发送到的ip和端口
            Socket socket = new Socket("127.0.0.1", 9999);
            //从socket获取输出流到缓冲写区
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));

            //获取Socket的输入流,用来接收从服务端发送过来的数据
            DataInputStream in = new DataInputStream(socket.getInputStream());

            while (true) {
                //获取键盘输入的内容到缓冲读区
                bufferedWriter.write(bufferedReader.readLine());
                bufferedWriter.write("\n");
                bufferedWriter.flush();

                //获取服务端返回的数据
                System.out.println(in.readUTF());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端2:

import java.io.*;
import java.net.Socket;

public class MainClient2 {
    public static void main(String[] args) {
        try {
            //设置发送到的ip和端口
            Socket socket = new Socket("127.0.0.1", 9999);
            //从socket获取输出流到缓冲写区
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));

            //获取Socket的输入流,用来接收从服务端发送过来的数据
            DataInputStream in = new DataInputStream(socket.getInputStream());

            while (true) {
                //获取键盘输入的内容到缓冲读区
                bufferedWriter.write(bufferedReader.readLine());
                bufferedWriter.write("\n");
                bufferedWriter.flush();

                //获取服务端返回的数据
                System.out.println(in.readUTF());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MainServer {
    public static void main(String[] args) {
        try {
            //服务端绑定端口
            ServerSocket serverSocket = new ServerSocket(9999);
            //定长线程池
            ExecutorService executorService = Executors.newFixedThreadPool(100);
            while (true) {
                Socket socket = serverSocket.accept();
                //每当有一个服务端连接到服务器就新开一个线程处理
                executorService.execute(() -> {
                    try {
                        //socket中获取输入流到缓冲区
                        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
                        //获取Socket的输出流,用来向客户端发送数据
                        DataOutputStream out = new DataOutputStream (socket.getOutputStream());
                        String str;
                        //读取缓冲区信息到str并输出
                        while (((str = reader.readLine()) != null)) {
                            System.out.println("客户端发来的消息:"+str);
                            //发送消息到对应的客户端
                            out.writeUTF("服务端回复:已收到你的消息\"" + str+"\"");
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

测试:
先启动服务端,再启动两个客户端,两个客户端可多次输入消息接受服务端的响应。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在idea中启动多个main的方法技巧:
在这里插入图片描述
要启动哪个就右上角切换哪个。


参考:

Java socket详解,看这一篇就够了

Java Socket 服务端发送数据 客户端接收数据

Java TCP Socket 编程

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值