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