<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            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

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院