以前一直不会写socket通信,最近看了一下bio突然就会了
你一句我一句的笨蛋通信方式
服务器代码:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class BioServer {
public static void main(String[] args){
int port = 16630;
Scanner scanner = new Scanner(System.in);
final boolean[] flag = new boolean[1];
flag[0] =true;
try {
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("服务器启动,监听端口:"+port);
while (true){
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功,地址"+socket.getInetAddress()+":"+socket.getPort());
new Thread(
()->{
while (flag[0]) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream());
String request = reader.readLine();
System.out.println("收到客户端数据:" + request);
String response = scanner.nextLine();
writer.println(response);
writer.flush();
if("拜拜".equals(response)){
flag[0] = false;
}
} catch (IOException e) {
}
}
}
).start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class BioClient {
public static void main(String[] args) {
String serverAddress = "localhost";
int serverPort = 16630;
boolean flag1 = true;
Scanner scanner = new Scanner(System.in);
final boolean[] flag = new boolean[1];
flag[0] =true;
//持续监听,先开后开服务器无所谓
while (flag1) {
try {
Socket socket = new Socket(serverAddress, serverPort);
System.out.println("连接服务器成功");
flag1 = false;
while (flag[0]){
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream());
String request = scanner.nextLine();
writer.println(request);
writer.flush();
System.out.println("发送请求给服务器:" + request);
String response = reader.readLine();
System.out.println("接收到服务器响应:" + response);
if("拜拜".equals(response)){
flag[0] = false;
}
}
}
//socket.close();
//System.out.println("连接关闭");
catch (Exception e) {
e.printStackTrace();
}
}
}
}
可以连发好几句的通信模式(自己的写法就是开两个线程,一个读一个写)
客户端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class BioClientPlus {
public static void main(String[] args) {
String serverAddress = "localhost";
int serverPort = 16630;
Scanner scanner = new Scanner(System.in);
boolean flag = true;
while (flag) {
try {
Socket socket = new Socket(serverAddress, serverPort);
System.out.println("连接服务器成功");
flag = false;
new Thread(
() -> {
try {
String response;
BufferedReader reader = null;
do {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
response = reader.readLine();
System.out.println(response);
} while (!response.equals("拜拜"));
reader.close();
} catch (IOException io) {
}
}
).start();
new Thread(
() -> {
try {
String request;
PrintWriter writer = null;
do {
writer = new PrintWriter(socket.getOutputStream());
request = scanner.nextLine();
writer.println(request);
writer.flush();
System.out.println("发送给服务器:" + request);
} while (!request.equals("拜拜"));
writer.close();
} catch (IOException io) {
}
}
).start();
} catch (Exception e) {
System.out.println("等待服务器开机");
}
}
}
}
服务器端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class BioServerPlus {
public static void main(String[] args){
int port = 16630;
Scanner scanner = new Scanner(System.in);
try {
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("服务器启动,监听端口:"+port);
while (true){
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功,地址"+socket.getInetAddress()+":"+socket.getPort());
new Thread(
()->{
try{
String response;
BufferedReader reader = null;
do {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
response = reader.readLine();
System.out.println(response);
}while (!response.equals("拜拜"));
reader.close();
}catch (IOException io){
}
}
).start();
new Thread(
()->{
try{
String request;
PrintWriter writer = null;
do {
writer = new PrintWriter(socket.getOutputStream());
request = scanner.nextLine();
writer.println(request);
writer.flush();
System.out.println("回复给客户端:" + request);
}while (!request.equals("拜拜"));
writer.close();
}catch (IOException io){
}
}
).start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}