现在有一个需求,就是要去给一台客户端主动去发送指令,或者推送消息,就寻求朋友问了问告诉我说socket可以实现,所以就在网上找了些资料一遍学习,一遍测试,现在把我最后的成果记录下来。
如果对于socket有概念上的不理解的话,可以去百度一下会有很多答案,而且都比较详细,就不多赘述了。
首先你要先明白你的网络环境(你需要以TCP协议还是UDP协议来交互socket默认是用TCP的,因为我的环境问题使用的UDP),区别服务端和客户端,我写了两个工具类,一个是服务端,一个是客户端的,主要都是通过输入输出流来交互信息。
代码如下:
服务端:
package com.yyg.utils.socket; import org.apache.log4j.Logger; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; /** * 服务端 */ public class SocketServerUtil { private Logger log = Logger.getLogger(SocketServerUtil.class); public static final Integer port = 9001; public void init () { try { //创建一个ServerSocket,port是客户端的端口 ServerSocket serverSocket = new ServerSocket(port); while (true){ //从请求队列中取出链接,如果只接受一次则不用使用while循环 Socket socket = serverSocket.accept(); //获取客户端信息 BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); String clientContent = input.readLine(); //接下来可以对信息进行操作,我这里是直接打印了,你可以读取或者做其他操作 System.out.println(clientContent); //初始化输出流,回复客户端 PrintStream out = new PrintStream(socket.getOutputStream()); //获取键盘输出的内容 String s = new BufferedReader(new InputStreamReader(System.in)).readLine(); //将信息发送给客户端 out.println("open"); //关闭 out.close(); input.close(); } } catch (IOException e) { log.error("服务器异常:" + e); } } }
客户端:
import org.apache.log4j.Logger; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.*; private static Logger log = Logger.getLogger(SocketServerUtil.class); public static final Integer port = 9001; public static final String host = "127.0.0.1"; /** * 客户端 发送TCP协议请求 * @param str */ public static void connectServerTCP (String str) { Socket socket = null; try { socket = new Socket(host, port); //接受服务端发送的数据 BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); //向服务端发送数据 PrintStream out = new PrintStream(socket.getOutputStream()); System.out.println("ready send info to server!!"); out.println(str); System.out.println("send info to server: "+ str); //发送后断掉连接 out.close(); input.close(); } catch (Exception e) { log.error("客户端链接异常"+ e); } finally { if (socket != null) { try { socket.close(); } catch (Exception e) { socket = null; log.error("关闭异常"+ e); } } } }
使用UDP协议的话,因我只写了客户端可以参考下,方法如下:
public static void connectUDP (String str) {
byte[] buf = str.getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length, new InetSocketAddress(host, port));
try {
DatagramSocket socket = new DatagramSocket(port);
socket.send(packet);
System.out.println(str);
socket.close();
} catch (SocketException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}