一.简单介绍
要实现服务器Server和客户端的双端通信,需要在Server和Client双方都实现读取信息和写入信息的功能,并且读和写没有先后顺序,能够同时进行(多线程)。
二.代码实现
服务器:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(7777);
//创建服务器对象时服务器要与客户端的端口号保持一致。
Socket socket=ss.accept();
InputStream is = socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
//创建可以读取字符输入流的对象,并利用缓冲区提高程序的效率.
OutputStream os=socket.getOutputStream();
PrintStream pr=new PrintStream(os);
//创建可以输出字符串的打印流对象.
Scanner sc=new Scanner(System.in);
//创建Scanner对象用于用键盘打出字符串.
new Thread(()->{
//使用匿名内部类重写Runnable函数式接口中的run()方法
while(true) {
//使接收客户端信息的操作可以无限循环
try {
System.out.println( br.readLine());
//用于接收客户端的信息并输出到控制台
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
new Thread(()->{
//使用匿名内部类重写Runnable函数式接口中的run()方法
while(true) {
//使服务器端输出信息的操作可以无限循环
String a = sc.next();
pr.println("服务器:" + a);
//用于读取键盘输入的信息并输出给客户端
}
}).start();
}
}
客户端:
import java.io.*;
import java.net.Socket;
import java.util.Objects;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("127.0.0.1",7777);
//127.0.0.1代表本机,端口号与服务器端保持一致.
InputStream is = socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
//创建可以读取字符输入流的对象,并利用缓冲区提高程序的效率.
OutputStream os=socket.getOutputStream();
PrintStream pr=new PrintStream(os);
//创建可以输出字符串的打印流对象.
Scanner sc=new Scanner(System.in);
new Thread(()->{
//使用匿名内部类重写Runnable函数式接口中的run()方法
while(true) {
//使接收服务器端信息的操作可以无限循环
try {
System.out.println( br.readLine());
//用于接收服务器端的信息并输出到控制台
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
new Thread(()->{
//使用匿名内部类重写Runnable函数式接口中的run()方法
while(true) {
//使客户端输出信息的操作可以无限循环
String a = sc.next();
pr.println("客户端:" + a);
//用于读取键盘输入的信息并输出给服务器端
}
}).start();
}
}