多线程和网路编程写的客户端和服务端的交流

客户端

 Socket socket = new Socket("127.0.0.1", 10001);
            Scanner sc = new Scanner(System.in);

Socket用于接收或输出数据,指定ip地址和端口

 while (true) {
                // 从连接通道中获取输出流
                OutputStream os = socket.getOutputStream();

                // 写出数据
                System.out.print("请输入要发送的消息 (输入exit退出): ");
                String str = sc.nextLine();

                if ("exit".equalsIgnoreCase(str)) {
                    break; // 用户输入exit,退出循环
                }

                os.write(str.getBytes());
                //清空缓冲区域
                os.flush();
            }

具体功能:可以输入多句语句;

首先创建一个' Socket '对象并将其连接到端口“127.0.0.1”的服务器10001。然后用Scanner从用户那里读取输入。用循环从套接字获取输出流,允许它向服务器发送数据。提示用户输入消息。如果用户键入“exit”,则循环中断,套接字关闭。否则,它将用户的输入消息转换为字节,并通过写入输出流将其发送到服务器。' os.flush()方法用于确保立即发送数据而不是缓冲数据。

服务端

  // 从连接通道中获取输入流读取数据(使用字符编码UTF-8)
            try (InputStream is = socket.getInputStream();
                 InputStreamReader isr = new InputStreamReader(is, "UTF-8");
                 BufferedReader reader = new BufferedReader(isr)) {
                int b;
                while ((b = reader.read()) != -1) {
                    System.out.print((char) b);
                }

接收到来自客户端的字符流,然后转化为字节流,然后利用缓冲流进行输出

ServerSocket ss = new ServerSocket(10001);

        //监听客户端的链接
        while(true){
            Socket socket = ss.accept();
            new Thread(new MyRun(socket)).start();
        }

accept等待收到来自客户端的信息,然后通过多线程的方式实现多个客户端同时对接

完整代码

客户端

package com.ln2;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws IOException {
        try {
            Socket socket = new Socket("127.0.0.1", 10001);
            Scanner sc = new Scanner(System.in);

            while (true) {
                // 从连接通道中获取输出流
                OutputStream os = socket.getOutputStream();

                // 写出数据
                System.out.print("请输入要发送的消息 (输入exit退出): ");
                String str = sc.nextLine();

                if ("exit".equalsIgnoreCase(str)) {
                    break; // 用户输入exit,退出循环
                }

                os.write(str.getBytes());
                //清空缓冲区域
                os.flush();
            }

            // 关闭
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务端

package com.ln1;

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

public class MyRun implements Runnable {

    Socket socket;

    public MyRun(Socket soket) {
        this.socket = soket;
    }

    @Override
    public void run() {
        try {
            // 从连接通道中获取输入流读取数据(使用字符编码UTF-8)
            try (InputStream is = socket.getInputStream();
                 InputStreamReader isr = new InputStreamReader(is, "UTF-8");
                 BufferedReader reader = new BufferedReader(isr)) {
                int b;
                while ((b = reader.read()) != -1) {
                    System.out.print((char) b);
                }

            } catch (IOException e) {
                e.printStackTrace();
            }

            // 关闭客户端连接
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

MyRun类被设计成一个可运行的任务。它接受一个' Socket '对象作为构造函数参数,表示此任务将处理的客户端套接字。使用UTF-8编码用于基于字符的读取。' BufferedReader'用于从输入流中读取字符。它读取字符,直到到达流的末尾,并在读取时将每个字符打印到控制台中。意味着在一个单独的线程中执行,以同时处理服务器应用程序中的多个客户端。

package com.ln1;


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

public class Server {
    public static void main(String[] args) throws IOException {
        //创建对象SeverSocket
        ServerSocket ss = new ServerSocket(10001);

        //监听客户端的链接
        while(true){
            Socket socket = ss.accept();
            new Thread(new MyRun(socket)).start();
        }

    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值