前言
项目遇到需要利用socket向别的项目推送数据,由于对于socket接触较少,我的第一反应就是对面有服务端,然后我把数据写成流传过去就可以,对于数据的加密和数据头的封装,只要两边规定好就ok。查了半天资料,基于本地自己建了一个类似聊天服务的通信。
正文
首先本文是基于TCP,可靠的连接。
使用socket,就要符合他的标准,大概分为几步:
创建socket
监听
获取想要传输的数据流
利用socket将数据流传输给对方
获取对方返给我们的数据流
关闭socket和输入输出流
service端
public class ServiceSocket {
public static void main(String arg[]){
try {
//建立套接字
ServerSocket server = new ServerSocket(3789);
//监听
Socket socket = server.accept();
// 获取想要传输的数据、并存入缓冲池
InputStreamReader systemIn = new InputStreamReader(System.in);
BufferedReader systemBuf = new BufferedReader(systemIn);
String serverData = systemBuf.readLine();
//建立输出流
PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
//在socket中获取客户端输入的、并存入缓冲池,打印客户端信息
InputStreamReader socketIn = new InputStreamReader(socket.getInputStream());
BufferedReader socketBuf = new BufferedReader(socketIn);
System.out.println("client:" + socketBuf.readLine());
//判断是否结束通信 结束符@@,双方该规定
while(!serverData.equals("@@")){
socketOut.println(serverData);
socketOut.flush();
System.out.println("server:" + serverData);
String clientData = socketBuf.readLine();
//当对方结束,传过来的就是null
if(!StringUtils.isEmpty(clientData)){
System.out.println("client:" + clientData);
}else {
break;
}
serverData = systemBuf.readLine();
}
//关闭socket和输入输出流
socketOut.close();
socketIn.close();
server.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
client端
public class ClientSocket {
public static void main(String arg[]){
try {
//创建Socket
Socket socket = new Socket("127.0.0.1",3789);
//建立连接,并把数据存入缓冲池
InputStreamReader systemIn = new InputStreamReader(System.in);
BufferedReader systemBuf = new BufferedReader(systemIn);
//建立输出流,进行通信
PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
String readline = systemBuf.readLine();
//在socket中获取服务端输入的、并存入缓冲池
InputStreamReader socketIn = new InputStreamReader(socket.getInputStream());
BufferedReader socketBuf = new BufferedReader(socketIn);
System.out.println("server:" + socketBuf.readLine());
while(!readline.equals("@@")){
socketOut.println(readline);
socketOut.flush();
System.out.println("client:" + readline);
readline = systemBuf.readLine();
}
//关闭socket和输入输出流
socketOut.close();
systemIn.close();
socket.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
以上数据都是读的一行,要是读取文件可以利用while循环在BufferedReader中读取多行,文中的@@是结束通话的结束符双方规定好即可。
结束
虽然现在已经2021年了,但是没有过阴历年总感觉还在2020年,希望年前项目可以顺利上线吧, 学习——永远不晚。