服务端
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);
//循环接收来自客户端的连接
while(true){
//2.等待客户端的连接 accept 阻塞方法
Socket socket = serverSocket.accept();
//socket帮我们包装好的输入字节流(二进制流)
InputStream is = socket.getInputStream();
//BufferedReader 字符串缓冲流 InputStreamReader转换流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//socket帮我们包装好的输出字节流
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
//先接收来自客户端的消息
//String line = br.readLine();
//while(line != null) 这种写法为什么不行呢
String line;
while((line = br.readLine()) != null) { //阻塞
System.out.println("我已经接收到了消息:" + line);
//对客户端做出响应
bw.write("您发送了 “" + line + "”的消息\n");
//flush刷新缓冲区 这时才将消息返回到对端
bw.flush();
}
}
}
}
客户端
package tcp;
import java.io.*;
import java.net.Socket;
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 = new Socket(IP,PORT);
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
OutputStream os = socket.getOutputStream();
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
// bw.write("hello\n");
// bw.write("hello"); 错误示例
// bw.flush();
PrintWriter pw = new PrintWriter(os,true); //自动刷新
pw.println("hello");
}
}
以上客户端的代码,发送完消息后,就会关闭连接。而服务端的连接还没有关
更新最简版本
服务端
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();
}
}
}
}
客户端
package tcp;
import java.io.*;
import java.net.Socket;
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那样手动刷新
//向服务端发送数据
pw.println("Hi,我来了!"); //直接带有"\n"
//接收来自服务端的响应
String response;
while ((response = br.readLine()) != null){
System.out.println(response);
}
}
}
运行结果:
以上代码 客户端发送完消息后,可以接收到来自服务端的响应