简单实现基于TCP的Socket多线程通信

本文深入探讨了客户端与服务器之间的通信流程,包括如何通过Socket建立连接,如何使用PrintWriter和BufferedReader进行数据交换,以及如何正确处理输入输出流。同时,介绍了服务器端如何监听并响应客户端请求,实现多客户端并发处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * 客户端
 */

public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1",6666);
            OutputStream os =   socket.getOutputStream(); //获取输出流,向服务器发送信息

            PrintWriter pw = new PrintWriter(os);//将输出流包装成打印流
            pw.write("客户端的信息来了");
            pw.flush();//刷新缓冲向服务器发送信息
            socket.shutdownOutput();

            //接收服务器响应的消息
            InputStream is = socket.getInputStream(); //得到字节流的对象
            InputStreamReader isr = new InputStreamReader(is,"utf-8");//包字节流转换成字符流
            BufferedReader br = new BufferedReader(isr);//构建缓冲区
            String info = null;
            while ((info=br.readLine())!=null) { //输出服务端接收的数据
                System.out.println(info);
            }
            socket.shutdownInput();
            //关闭资源
            br.close();
            isr.close();
            is.close();

            pw.close();
            os.close();
            socket.close();

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
/**
 * 服务器端
 * 
 * @author Administrator
 * 
 */
public class Server {

    public static void main(String[] args) {

        try {
            ServerSocket serverSocket = new ServerSocket(6666);// 给端口号
            System.out.println("服务器开始监听了啊"); //给的一个提示
            Socket socket = null;
            int count = 0;
            while (true) { //每个客户端给一个新线程

                socket = serverSocket.accept();// 阻塞监听客户端消息,得到连接对象
                ServerThread st = new ServerThread(socket);
                //未设置线程优先级可能会导致运行时速度非常慢,可降低优先级
                st.setPriority(4);//设置线程优先级,范围【1,10】默认为5
                st.start();
                InetAddress ia = socket.getInetAddress();
            count++;
                System.out.println("第"+count+"个客户端");
                System.out.println("IP地址"+ia.getHostAddress());
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
/*
 * 服务器端处理类
 */
public class ServerThread extends Thread {
    public Socket socket;

    public ServerThread(Socket socket){
        this.socket = socket;
    }

    @Override
        public void run() {
            InputStream is =null;
            InputStreamReader isr=null;
            BufferedReader br=null;
            OutputStream os = null;
            PrintWriter pw =null;
         try {
             //监听客户端消息,得到连接对象
             is = socket.getInputStream();//获取到客户端输入的,字节流
             isr = new InputStreamReader(is);//将字节流转换成字符流
             br = new BufferedReader(isr); //读取数据进入缓冲区
            String data =null;
            while((data=br.readLine())!=null){  //输出客户端接收的数据
                System.out.println(data);
            }
            socket.shutdownInput();
             os = socket.getOutputStream(); //获取输出流
             pw = new PrintWriter(os);  //包装成打印流
            pw.write("服务器说:给你会消息了");


            pw.flush();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                //关闭资源
                /*if(pw!=null){
                    pw.close();
                }*/
                if(os!=null){
                    os.close();
                }
                if(br!=null){
                    br.close();
                }
                if(isr!=null){
                    isr.close();
                }
                if(is!=null){
                    is.close();
                }
                if(socket!=null){
                    socket.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值