栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

具有多客户端通信的Java Server。

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

具有多客户端通信的Java Server。

在这里,我与您分享了一个不错的 聊天程序 ,其中包含一台服务器,该服务器根据您的要求使用TCP协议与多个客户端进行通信。

程序包含:

  • 无论在何处添加新客户,都会通知每个客户及其名称和职位。
  • 它还会检查现有名称。程序不允许多个客户端使用相同的名称。

使用此程序作为游戏的初始启动器。如果您想在程序中添加新功能,请告诉我。

这是代码(有关更多说明,请参见代码注释):

注意: 在端口号1234上运行此程序之前,请先替换LiveChatClient.java文件中的主机名。

运行程序的步骤:

  • 第一次只运行LiveChatServer
  • 然后为要添加的多个客户端运行LiveChatClient

Oppre.java:

用于设置客户端-服务器通信协议的操作代码

package com.chat;public interface Oppre {    int CLIENT_ConNECTEING = 1;    int CLIENT_ConNECTED = 2;}

LiveChatServer.java:

控制多个客户端的单个服务器

package com.chat;import java.io.IOException;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;import java.util.HashMap;import java.util.linkedHashMap;public class LiveChatServer {    // Connection state info    private static linkedHashMap<String, ClientThread> clientInfo = new linkedHashMap<String, ClientThread>();    // TCP Components    private ServerSocket serverSocket;    // Main Constructor    public LiveChatServer() {        startServer();// start the server    }    public void startServer() {        String port = "1234";        try { // in constractor we are passing port no, back log and bind address whick will be local // host // port no - the specified port, or 0 to use any free port. // backlog - the maximum length of the queue. use default if it is equal or less than 0 // bindAddr - the local InetAddress the server will bind to int portNo = Integer.valueOf(port); serverSocket = new ServerSocket(portNo, 0, InetAddress.getLocalHost()); System.out.println(serverSocket); System.out.println(serverSocket.getInetAddress().getHostName() + ":"         + serverSocket.getLocalPort()); while (true) {     Socket socket = serverSocket.accept();     new ClientThread(socket); }        } catch (IOException e) { System.out.println("IO Exception:" + e); System.exit(1);        } catch (NumberFormatException e) { System.out.println("Number Format Exception:" + e); System.exit(1);        }    }    public static HashMap<String, ClientThread> getClientInfo() {        return clientInfo;    }    // *********************************** Main Method ********************    public static void main(String args[]) {        new LiveChatServer();    }}

LiveChatClient.java:

多个客户端通过服务器互相交谈

package com.chat;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.InetAddress;import java.net.Socket;import java.net.SocketException;public class LiveChatClient {    private String chatName;// current user's chat name(max 7 char if greater than show as 6      // char+...    private String serverAddress;    // TCP Components    private Socket socket;    private BufferedReader in;    private PrintWriter out;    public LiveChatClient() {        initHostName();        runClient();// have fun    }    public void initHostName() {        try { //replace host name with your computer name or IP address serverAddress = "[hostname]"; if (serverAddress == null)     System.exit(1); serverAddress = serverAddress.trim(); if (serverAddress.length() == 0)// empty field {     System.out.println("Server IP Address or Name can't be blank.");     initHostName();     return; } System.out.println("Trying to connect with server...nServer IP Address:"         + serverAddress); // create socket InetAddress inetAddress = InetAddress.getByName(serverAddress); if (!inetAddress.isReachable(60000))// 60 sec {     System.out  .println("Error! Unable to connect with server.nServer IP Address may be wrong.");     System.exit(1); } initPortNo();        } catch (SocketException e) { System.out.println("Socket Exception:n" + e); initHostName(); return;        } catch (IOException e) { initHostName(); return;        }    }    public void initPortNo() {        try { String portNo = "1234"; portNo = portNo.trim(); if (portNo.length() == 0)// empty field {     System.out.println("Server port No can't be blank.");     initPortNo();     return; } System.out.println("Trying to connect with server...nServer Port No:" + portNo); socket = new Socket(serverAddress, 1234); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true);        } catch (IOException e) { System.out.println("IO Exception:n" + e); initPortNo(); return;        }    }    public void sendChatName() throws IOException {        System.out.println("Enter your name:");        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        String name = br.readLine();        if (name == null) System.exit(1);        // title case (get only first 9 chars of chat name)        name = name.trim();        if (name.equalsIgnoreCase("All")) { System.out.println("This name is already reserved. Try different one."); sendChatName(); return;        }        if (name.length() == 0) { System.out.println("Please enter your chat name."); sendChatName(); return;        }        if (name.length() == 1) chatName = String.valueOf(name.charAt(0)).toUpperCase();        if (name.length() > 1 && name.length() < 10) chatName = String.valueOf(name.charAt(0)).toUpperCase()         + name.substring(1).toLowerCase();        else if (name.length() > 9) chatName = String.valueOf(name.charAt(0)).toUpperCase()         + name.substring(1, 10).toLowerCase();        // sending oppre first then sending chatName to the server        out.println(Oppre.CLIENT_CONNECTEING);        out.println(chatName);    }    public void runClient() {        try { sendChatName(); while (true) {     int oppre = Integer.parseInt(in.readLine());     switch (oppre) {         case Oppre.CLIENT_CONNECTEING:  // this client is connecting  boolean result = Boolean.valueOf(in.readLine());  if (result) {      System.out   .println(chatName + " is already present. Try different one.");      runClient();  }  break;         case Oppre.CLIENT_CONNECTED:  // a new client is connected  Integer totalClient = Integer.valueOf(in.readLine());  System.out.println("Total Client:" + totalClient);  for (int i = 0; i < totalClient; i++) {      String client = in.readLine();      System.out.println((i + 1) + ":" + client);  }  break;     } }        } catch (IOException e) { System.out.println("Client is closed...");        }    }    // *********************************** Main Method ********************    public static void main(String args[]) {        new LiveChatClient();    }}

ClientThread.java:

服务器为每个客户端启动一个多线程,并包含有关所有已连接客户端的信息

package com.chat;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.util.HashMap;public class ClientThread implements Runnable {    // TCP Components    private Socket socket;    private BufferedReader in;    private PrintWriter out;    private String chatName;    // seperate thread    private Thread thread;    // boolean variable to check that client is running or not    private volatile boolean isRunning = true;    // oppre    private int oppre;    private HashMap<String, ClientThread> clientInfo = new HashMap<String, ClientThread>();    public ClientThread(Socket socket) {        try { this.socket = socket; this.clientInfo = LiveChatServer.getClientInfo(); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); thread = new Thread(this); thread.start();        } catch (IOException e) { System.out.println(e);        }    }    public void run() {        try { while (isRunning) {     if (!in.ready())         continue;     oppre = Integer.parseInt(in.readLine());// getting oppre first from client     switch (oppre) {         case Oppre.CLIENT_CONNECTEING:  chatName = in.readLine();  boolean result = clientInfo.containsKey(chatName);  out.println(Oppre.CLIENT_CONNECTEING);  out.println(result);  if (result)// wait for another chat name if already present      continue;  // send list of already online users to new online user  // for (Object user : clientInfo.keySet().toArray()) {  // out.println(Oppre.CLIENT_CONNECTED);  // out.println(user.toString());  // }  // put new entry in clientInfo hashmap  clientInfo.put(chatName, this);  int i = 0;  for (String key : clientInfo.keySet()) {      if (key.equals(chatName)) {          System.out.println(chatName + " added at " + (i + 1) + " position");      }      i++;  }  // tell other users about new added user and update their online users list  for (ClientThread client : clientInfo.values()) {      client.out.println(Oppre.CLIENT_CONNECTED);      client.out.println(clientInfo.size());      for (ClientThread client1 : clientInfo.values()) {          client.out.println(client1.chatName);      }  }  break;     } } // clsoe all connections out.close(); in.close(); socket.close();        } catch (IOException e) { System.out.println(e);        }    }}

这是添加两个客户端时的输出。

服务器:

ServerSocket[addr=computerName/IPAddress,port=0,localport=1234]computerName:1234Abc added at 1 positionXyz added at 2 position

客户1:

Trying to connect with server...Server IP Address:computerNameTrying to connect with server...Server Port No:1234Enter your name:abcTotal Client:11:AbcTotal Client:21:Abc2:Xyz

客户2:

Trying to connect with server...Server IP Address:computerNameTrying to connect with server...Server Port No:1234Enter your name:xyzTotal Client:21:Abc2:Xyz


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/449492.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号