客户端
- 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();
- }
-
- }
- }
-