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.*;
使用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();
}
}
如果对于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();
}
}
相关文章推荐
- Java 利用套接字Socket实现简单的服务器与客户端通信
- Java网络编程ServerSocket的实现服务器与用户之间的通信的基本步骤
- java 通过 socket 实现 服务器和客户端的通信 TCP
- Java 利用套接字Socket实现简单的服务器与客户端通信
- java socket 单服务器多客户端实时通信
- Socket TCP协议 实时通信的粘包处理 Java与C++实现
- java的nio之:java的bio流下实现的socket服务器同步阻塞模型和socket的伪异步的socket服务器的通信模型
- java 通过 socket 实现 服务器和客户端的通信 TCP
- Android客户端与PC服务器实现Socket通信(wifi)
- 一个 Java 的 Socket 服务器和客户端通信的例子
- 在 Linux 上实现基于 Socket 的多进程实时通信
- 一个 Java 的 Socket 服务器和客户端通信的例子
- C++服务器与java进行socket通信案例
- 在 Linux 上实现基于 Socket 的多进程实时通信
- 在 Linux 上实现基于 Socket 的多进程实时通信
- java版客户端与服务器的socket通信以及上传下载
- 在 Linux 上实现基于 Socket 的多进程实时通信
- 在 Linux 上实现基于 Socket 的多进程实时通信
- 在 Linux 上实现基于 Socket 的多进程实时通信
- 在 Linux 上实现基于 Socket 的多进程实时通信