客户端使用Scanner scanner = new Scanner(System.in)
客户端代码
package tcp;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class TCPClients {
private static final int PORT = 1000;
private static final String IP = "127.0.0.1";
public static void main(String[] args) throws Exception {
//3.创建socket对象,建立服务端远程连接
Socket socket = new Socket(IP,PORT);
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os,true); //可以自动刷新,不需要像bw.flush那样手动刷新
//向服务端发送数据(在控制台输入数据)
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextLine()){
String line = scanner.nextLine();
pw.println(line);
//接收来自服务端的响应
// String response;
// while ((response = br.readLine()) != null){
// System.out.println(response);
// } //错误代码 在控制台只能输入一条数据并得到回复,再次发送第二条数据时,就会一直阻塞等待(服务端针对每一条数据的响应只有一句话)
String response = br.readLine();
System.out.println(response);
}
}
}
服务端代码
package tcp;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
private static final int PORT = 1000;
public static void main(String[] args) throws IOException {
//1.启动TCP连接
ServerSocket serverSocket = new ServerSocket(PORT);
//2.accept监听客户端连接 阻塞等待新的客户端连接
while(true) {
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
String line;
//先接收来自客户端的消息,然后做出响应
while((line = br.readLine()) != null) {
System.out.println("接收到:" + line + "消息");
//对客户端发送的消息做出响应
//字符串最终的“\n”不能忘记
//否则客户端 (response = br.readLine() 会阻塞
//readLine()读取到"\n"才会认为已经读取完毕,然后返回"\n"之前的字符串
bw.write("消息已成功接收\n");
//flush刷新缓冲区
bw.flush();
}
}
}
}
运行结果
客户端
服务端