Java TCP
TCP只支持一个客户端一个服务端进行连接通信,第二个客户端连接同一个服务端时会因为上一个客户端正在通信阻塞中,倒是消息发送不到服务端中.
服务端
import java.io.BufferedReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket;
public class TcpServerSocket { public static void main(String[] args) throws Exception { tcpServer(8080); }
public static void tcpServer(int port) throws Exception {
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("TCP 监听: " + port + "端口");
while (true) {
try (Socket socket = serverSocket.accept()) {
System.out.println("当前连接TCP的ip为: " + socket.getInetAddress());
PrintWriter pw = TCPUtil.getPrintWriter(socket);
BufferedReader br = TCPUtil.getReader(socket);
pw.println("欢迎使用TCP服务!");
pw.flush();
String msg = null;
while ((msg = br.readLine()) != null) {
if (msg.equals("bye")) {
pw.println("服务器断开连接,服务结束!");
System.out.println("客户端离开,服务结束!");
break;
}
System.out.println("客户端发送的消息: " + msg);
pw.println("服务器接收到客户端消息: " + msg);
}
}
}
}
}
2. 客户端
```java
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class TCPClientSocket {
public static void main(String[] args) throws Exception {
tcpClient("127.0.0.1", 8080);
}
public static void tcpClient(String ip, int port) throws Exception {
Socket socket = new Socket(ip, port);
PrintWriter pw = TCPUtil.getPrintWriter(socket);
BufferedReader br = TCPUtil.getReader(socket);
Scanner sc = new Scanner(System.in);
System.out.println(br.readLine());
while (sc.hasNext()) {
String msg = sc.nextLine();
pw.println(msg);
System.out.println(br.readLine());
if (msg.equals("bye")) {
break;
}
}
}
}
TCPUtil ```java package org.example.socket;
import java.io.*; import java.net.Socket; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets;
public class TCPUtil { private static final Charset encoding = StandardCharsets.UTF_8;
public static PrintWriter getPrintWriter(Socket socket) throws Exception {
//获得输出流缓冲区的地址
OutputStream socketOut = socket.getOutputStream();
//网络流写出需要使用flush,这里在printWriter构造方法直接设置为自动flush
return new PrintWriter(new OutputStreamWriter(socketOut, encoding), true);
}
public static BufferedReader getReader(Socket socket) throws IOException {
//获得输入流缓冲区的地址
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn, encoding));
}
}
浙公网安备 33010602011771号