<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. java語言

    Java如何通過Socket實現TCP服務端

    時間:2025-04-27 05:59:36 java語言 我要投稿
    • 相關推薦

    Java如何通過Socket實現TCP服務端

      Socket 通常也稱作“套接字”,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<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() {

      }

      /**

      * 獲取實例

      * @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<String, SocketThread> 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 = 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

      }

    【Java如何通過Socket實現TCP服務端】相關文章:

    如何運用Java socket實現多人聊天室功能11-06

    講解Java的Socket網絡編程的多播與廣播實現09-03

    java如何通過url讀取文件05-07

    如何通過編程發現Java死鎖08-30

    java如何實現漢諾塔08-08

    java通用組合算法如何實現09-12

    Java中如何實現顯示動態的時間09-28

    Java網絡基礎和Socket通信基礎10-25

    Java中Socket設置連接超時的代碼09-08

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人