您的位置:首页 > 编程语言 > Java开发

Java 实现socket 与服务器实现实时通信

2018-03-02 15:46 501 查看
        现在有一个需求,就是要去给一台客户端主动去发送指令,或者推送消息,就寻求朋友问了问告诉我说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(pa
9190
cket);
System.out.println(str);
socket.close();
} catch (SocketException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: