现在有一个需求,就是要去给一台客户端主动去发送指令,或者推送消息,就寻求朋友问了问告诉我说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();
}
}