参考链接:https://blog.csdn.net/a78270528/article/details/80318571
1、一对一双向通信
服务端
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args) throws Exception {
// 监听指定的端口
int port = 55533;
ServerSocket server = new ServerSocket(port);
// server将一直等待连接的到来
System.out.println("server将一直等待连接的到来");
Socket socket = server.accept();
System.out.println(socket.getInetAddress() + ":" + socket.getPort() + "连接到服务器");
// 建立好连接后,从socket中获取输入流,并建立缓冲区进行读取
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
//只有当客户端关闭它的输出流的时候,服务端才能取得结尾的-1
while ((len = inputStream.read(bytes)) != -1) {
// 注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-8
sb.append(new String(bytes, 0, len, "UTF-8"));
}
System.out.println("服务端从客户端收到的信息: " + sb);
// 服务端接收到客户端的socket.shutdownOutput()消息后再发送一条消息给客户端
OutputStream outputStream = socket.getOutputStream();
outputStream.write(
("你好客户端" + socket.getInetAddress() + ":" + socket.getPort()
+ "我是服务端,我从你这里收到的信息是:" + sb).getBytes("UTF-8")
);
outputStream.flush();
inputStream.close();
outputStream.close();
socket.close();
server.close();
}
}
客户端:
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class SocketClient {
public static void main(String args[]) throws Exception {
// 要连接的服务端IP地址和端口
String host = "127.0.0.1";
int port = 55533;
// 在这一步连接服务端,被服务端监听到
Socket socket = new Socket(host, port);
// 用于接收服务端发送的消息输入流
InputStream inputStream = socket.getInputStream();
// 将消息发送给服务端的输出流
OutputStream outputStream = socket.getOutputStream();
// 发送消息给服务端
while (true){
// 键盘输入消息
Scanner sc = new Scanner(System.in);
String message;
if ((message = sc.next())!=null) {
// flush只是把数据发送到服务端,但服务端并不知道你传没传完
// (比如要传一份文件一次flush可能只传了一部分的数据,后续还需要继续传数据)
// 只有socket.shutdownOutput服务端才知道客户端已经传完了(代表客户端已经把整份文件的数据传好了)
if ("quit".equals(message)) { // quit代表输入结束
socket.shutdownOutput();
break;
}
byte[] sendBytes = message.getBytes("UTF-8");
outputStream.write(sendBytes);
outputStream.flush();
}
}
// 接收从服务端返回的消息
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
//注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-8
sb.append(new String(bytes, 0, len,"UTF-8"));
}
System.out.println("get message from server: " + sb);
// 关闭流和socket
outputStream.close();
inputStream.close();
socket.close();
}
}
服务端
server将一直等待连接的到来
/127.0.0.1:54579连接到服务器
服务端从客户端收到的信息: 123ttt
客户端
123
ttt
quit
get message from server: 你好客户端/127.0.0.1:54579我是服务端,我从你这里收到的信息是:123ttt