• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Java通过 Socket 实现 TCP服务端

java 搞代码 4年前 (2022-01-05) 20次浏览 已收录 0个评论

这篇文章主要介绍了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; /** * TCP服务器端,单例模式 * @author xiang * */ public class TCPServer implements Runnable { private static final Logger logger = LoggerFactory.getLogger(TCPServer.class); //成员变量/ private static TCPServer serverInstance; private static Map socketMaps = new HashMap();        //每个客户端连接时都会新建一个SocketThread与之对应  private static ServerSocket serverSocket;          //服务器套接字 private static int serPort = 9999;              //服务器端口号 private static boolean flag;                //服务器状态标志 private static final int BUFFER_SIZE = 512;          //数据接收字符数组大小 //构造函数/ private TCPServer() { } /** * 获取实例 * @return TCPServer实例serverInstance */ public static TCPServer getServerInstance(){ if(serverInstance==null) serverInstance = new TCPServer(); return serverInstance; } /** * 开启服务器 * @throws IOException */ public void openTCPServer() throws IOException{    if(serverSocket==null || serverSocket.isClosed()){ serverSocket = new ServerSocket(serPort); flag = true; } } /** * 关闭服务器 * @throws IOException */ public void closeTCPServer() throws IOException{ flag = false;   if(serverSocket!=null) serverSocket.close(); /*for (Map.Entry entry : socketMaps.entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); } */ for (SocketThread value : socketMaps.values()) value.closeConnect(); socketMaps.clear(); } /** * 服务器向客户端发送数据 * @param bytes[]:待发送的字符数组 * @param key 客户端的key,为空或""时表示数据群发 * @throws IOException */ 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); } } /** * 服务器向客户端发送数据 * @param key 客户端的key,为空或""时表示数据群发 * @param msgStr:待发送的字符串 * @throws IOException */ 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(); } } } /** * 处理连接后的数据接收请求内部类 * @author xiang * */ 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; } /** * 发送数据 * @param bytes * @throws IOException */ 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); } } /** * 关闭连接,释放资源 * @throws IOException */ 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 = s<div style="color:transparent">来源gaodai.ma#com搞##代!^码网</div>ocket.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 } 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

以上就是Java通过 Socket 实现 TCP服务端的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Java通过 Socket 实现 TCP服务端
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址