文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在Java项目中使用Socket 如何实现 一个TCP服务端

2023-05-31 15:14

关注

在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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯