在Java项目中使用Socket 如何实现 一个TCP服务端?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
1 Java Socket简介
所谓socket 通常也称作”套接字“,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。Socket和ServerSocket类库位于Java.NET包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。
2 TCPServer代码实例
import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.Date;import java.util.HashMap;import java.util.Map;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class TCPServer implements Runnable { private static final Logger logger = LoggerFactory.getLogger(TCPServer.class); //成员变量/ private static TCPServer serverInstance; private static Map<String, SocketThread> socketMaps = new HashMap<String,SocketThread>(); //每个客户端连接时都会新建一个SocketThread与之对应 private static ServerSocket serverSocket; //服务器套接字 private static int serPort = 9999; //服务器端口号 private static boolean flag; //服务器状态标志 private static final int BUFFER_SIZE = 512; //数据接收字符数组大小 //构造函数/ private TCPServer() { } public static TCPServer getServerInstance(){ if(serverInstance==null) serverInstance = new TCPServer(); return serverInstance; } public void openTCPServer() throws IOException{ if(serverSocket==null || serverSocket.isClosed()){ serverSocket = new ServerSocket(serPort); flag = true; } } public void closeTCPServer() throws IOException{ flag = false; if(serverSocket!=null) serverSocket.close(); for (SocketThread value : socketMaps.values()) value.closeConnect(); socketMaps.clear(); } public void sendMessage(String key,byte[] msgBytes){ if(key==null||key.equals("")){ for (SocketThread value : socketMaps.values()) value.sendMassage(msgBytes); }else{ SocketThread thread = socketMaps.get(key); if(thread!=null) thread.sendMassage(msgBytes); } } public void sendMessage(String key,String msgStr){ byte[] sendByte = msgStr.getBytes(); if(key==null||key.equals("")){ for (SocketThread value : socketMaps.values()) value.sendMassage(sendByte); }else{ SocketThread thread = socketMaps.get(key); if(thread!=null) thread.sendMassage(sendByte); } } @Override public void run() { logger.info("服务器线程已经启动"); while(true){ try { while(flag){ logger.info("服务器线程在监听状态中"); Socket socket = serverSocket.accept(); String key = socket.getRemoteSocketAddress().toString(); SocketThread thread = new SocketThread(socket,key); thread.start(); socketMaps.put(key, thread); logger.info("有客户端连接:"+key); } } catch (Exception e) { e.printStackTrace(); } } } private class SocketThread extends Thread{ private Socket socket; private String key; private OutputStream out; private InputStream in; //构造函数 public SocketThread(Socket socket,String key) { this.socket = socket; this.key = key; } public void sendMassage(byte[] bytes){ try { if(out==null) out = socket.getOutputStream(); out.write(bytes); } catch (Exception e) { e.printStackTrace(); try { closeConnect(); } catch (IOException e1) { e1.printStackTrace(); } socketMaps.remove(key); } } public void closeConnect() throws IOException{ if(out!=null) out.close(); if(in!=null) in.close(); if(socket!=null && socket.isConnected()) socket.close(); } @Override public void run() { byte[] receivBuf = new byte[BUFFER_SIZE]; int recvMsgSize; try { in = socket.getInputStream(); out = socket.getOutputStream(); while ((recvMsgSize = in.read(receivBuf)) != -1) { String receivedData = new String(receivBuf, 0, recvMsgSize); System.out.println("Reverve form[port" + socket.getPort() + "]:" + receivedData); System.out.println("Now the size of socketMaps is" + socketMaps.size()); } // response to client byte[] sendByte = "The Server has received".getBytes(); // out.write(sendByte, 0, sendByte.length); out.write(sendByte); System.out.println("To Cliect[port:" + socket.getPort() + "] 回复客户端的消息发送成功"); closeConnect(); socketMaps.remove(key); } catch (Exception e) { e.printStackTrace(); try { closeConnect(); } catch (IOException e1) { e1.printStackTrace(); } } } ////////////// public int getport(){ return socket.getPort(); } } //. end SocketThread }
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容猜你喜欢
AI推送时光机在Java项目中使用Socket 如何实现 一个TCP服务端
后端开发2023-05-31
在java项目中使用 Socket如何实现模拟一个HTTP服务器
后端开发2023-05-31
在c#中使用Socket实现一个tcp协议
后端开发2023-06-06
在Java项目中如何实现一个同步锁
后端开发2023-05-31
Java编程Socket如何实现多个客户端连接同一个服务端
后端开发2023-05-30
怎么在JAVA项目中实现一个TCP网络通讯功能
后端开发2023-05-31
在springboot项目中使用quartz如何实现一个定时任务
后端开发2023-05-31
在java项目中如何实现一个单例模式
后端开发2023-05-31
如何在java项目中实现一个高并发锁
后端开发2023-05-31
如何在java项目中实现一个递归调用功能
后端开发2023-06-06
如何在Java项目中实现一个命令模式
后端开发2023-05-31
在Java项目中使用WebUploader如何实现一个文件上传功能
后端开发2023-05-31
在java项目中使用Demo如何实现一个文件上传功能
后端开发2023-05-31
如何在Java项目中实现一个时间轮算法
后端开发2023-05-31
如何在java项目中实现一个ECC加密算法
后端开发2023-05-31
如何在Java项目中实现一个DES加密算法
后端开发2023-05-31
在Java项目中使用递归如何实现一个文件读取功能
后端开发2023-05-31
如何在Java项目中使用OCR tesseract实现一个图文识别功能
后端开发2023-05-31
在mybatis项目中使用oracle如何实现一个分页效果
后端开发2023-05-31
咦!没有更多了?去看看其它编程学习网 内容吧