java访问其它服务器_java – 多个客户端同时访问服务器

在这里,我将与您分享一个不错的客户端服务器身份验证应用程序,其中有一台服务器根据您的要求使用TCP协议与多个客户端进

回答:

Here each client is connected in a separate thread from server and that thread contains all the information about the client. It will solve your concurrency problem.

有关更多说明,请参阅内联注释.

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

运行程序的步骤:

>首先只运行一次LiveChatServer

>然后为多个客户端运行LiveChatClient,尽可能多地添加

Opcode.java:

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

/**************** an interface to define different operation code **************/

public interface Opcode {

int CLIENT_USERNAME = 1;

int CLIENT_INVALID_USERNAME = 2;

int CLIENT_PASSWORD = 3;

int CLIENT_INVALID_PASSWORD = 4;

int CLIENT_CONNECTED = 5;

}

LiveChatServer.java:

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

/************************ Live Chat Server *******************/

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 clientInfo = new LinkedHashMap();

// 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 getClientInfo() {

return clientInfo;

}

// *********************************** Main Method ********************

public static void main(String args[]) {

new LiveChatServer();

}

}

LiveChatClient.java:

多个客户端连接到单个服务器

/************************ Live Chat Client *******************/

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;

private String password;

private String serverAddress;

// TCP Components

private Socket socket;

private BufferedReader in;

private PrintWriter out;

public LiveChatClient() {

initHostName();

runClient();// have fun

}

public void initHostName() {

try {

serverAddress = "";

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...

Server 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.

Server IP Address may be wrong.");

System.exit(1);

}

initPortNo();

} catch (SocketException e) {

System.out.println("Socket Exception:

" + 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...

Server 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:

" + e);

initPortNo();

return;

}

}

public void sendChatName() throws IOException {

System.out.println("Enter user 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)

chatName = name.trim();

if (name.length() == 0) {

System.out.println("Please enter user name.");

sendChatName();

return;

}

// sending opcode first then sending chatName to the server

out.println(Opcode.CLIENT_USERNAME);

out.println(chatName);

}

public void sendPassword() throws IOException {

System.out.println("Enter password:");

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 password)

password = name.trim();

if (name.length() == 0) {

System.out.println("Please enter password.");

sendPassword();

return;

}

// sending opcode first then sending password to the server

out.println(Opcode.CLIENT_PASSWORD);

out.println(password);

}

public void runClient() {

try {

sendChatName();

while (true) {

int opcode = Integer.parseInt(in.readLine());

switch (opcode) {

case Opcode.CLIENT_INVALID_USERNAME:

// this client is connecting

System.out.println(chatName + " is invalid user name. Try different one.");

sendChatName();

break;

case Opcode.CLIENT_PASSWORD:

sendPassword();

break;

case Opcode.CLIENT_INVALID_PASSWORD:

// this client is connecting

System.out.println(password + " is invalid password. Try different one.");

sendPassword();

break;

case Opcode.CLIENT_CONNECTED:

System.out.println(chatName + " is connected successfully.");

break;

}

}

} catch (IOException e) {

System.out.println("Client is closed...");

}

}

// *********************************** Main Method ********************

public static void main(String args[]) {

new LiveChatClient();

}

}

ClientThread.java:

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

/************************ Client Thread *******************/

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.util.HashMap;

import java.util.Map;

public class ClientThread implements Runnable {

// TCP Components

private Socket socket;

private BufferedReader in;

private PrintWriter out;

private String chatName;

private String password;

// seperate thread

private Thread thread;

// boolean variable to check that client is running or not

private volatile boolean isRunning = true;

// opcode

private int opcode;

private static Map userpass = new HashMap();

static {

userpass.put("amit", "pass");

userpass.put("ajay", "word");

}

public ClientThread(Socket socket) {

try {

this.socket = socket;

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;

opcode = Integer.parseInt(in.readLine());// getting opcode first from client

switch (opcode) {

case Opcode.CLIENT_USERNAME:

chatName = in.readLine();

System.out.println(chatName + " is reqesting to connect.");

boolean result1 = userpass.containsKey(chatName);

if (result1) {

System.out.println(chatName + " is a valid username.");

out.println(Opcode.CLIENT_PASSWORD);

} else {

System.out.println(chatName + " is a invalid username.");

out.println(Opcode.CLIENT_INVALID_USERNAME);

}

break;

case Opcode.CLIENT_PASSWORD:

password = in.readLine();

System.out.println(chatName + " is reqesting to connect having password "

+ password);

boolean result2 = userpass.get(chatName).equals(password);

if (result2) {

System.out.println(password + " is a valid password for username "

+ chatName);

out.println(Opcode.CLIENT_CONNECTED);

} else {

System.out.println(password + " is a invalid password for username "

+ chatName);

out.println(Opcode.CLIENT_INVALID_PASSWORD);

}

break;

}

}

// close all connections

out.close();

in.close();

socket.close();

} catch (IOException e) {

System.out.println(e);

}

}

}

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

服务器:

ServerSocket[addr=computerName/14.98.241.102,port=0,localport=1234]

computerName:1234

abc is reqesting to connect.

abc is a invalid username.

ajay is reqesting to connect.

ajay is a valid username.

ajay is reqesting to connect having password word

word is a valid password for username ajay

amit is reqesting to connect.

amit is a valid username.

amit is reqesting to connect having password word

word is a invalid password for username amit

amit is reqesting to connect having password pass

pass is a valid password for username amit

客户端1:(阿杰)

Trying to connect with server...

Server IP Address:computerName

Trying to connect with server...

Server Port No:1234

Enter user name:

abc

abc is invalid user name. Try different one.

Enter user name:

ajay

Enter password:

word

ajay is connected successfully.

客户端2:(阿米特)

Trying to connect with server...

Server IP Address:computerName

Trying to connect with server...

Server Port No:1234

Enter user name:

amit

Enter password:

word

word is invalid password. Try different one.

Enter password:

pass

amit is connected successfully.

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用多线程技术实现多个客户端同时访问一个服务器。具体实现方法如下: 1.创建一个服务器端,监听客户端的连接请求; 2.当有客户端连接时,创建一个新的线程来处理该客户端的请求; 3.服务器通过Socket对象与客户端进行通信,使用IO流来传输数据; 4.当客户端请求处理完成后,关闭与该客户端的Socket连接; 5.服务器端继续监听新的客户端连接请求,循环执行上述步骤。 示例代码如下: ```java import java.io.*; import java.net.*; public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(8000); while (true) { Socket socket = serverSocket.accept(); new Thread(new ServerThread(socket)).start(); } } catch (IOException e) { e.printStackTrace(); } } } class ServerThread implements Runnable { private Socket socket; public ServerThread(Socket socket) { this.socket = socket; } @Override public void run() { try { BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true); String line; while ((line = in.readLine()) != null) { System.out.println("Received: " + line); out.println("Server response: " + line); } socket.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 该示例代码创建了一个服务器端,监听8000端口的连接请求。当有客户端连接时,创建一个新的线程来处理该客户端的请求。线程中通过Socket对象与客户端进行通信,使用BufferedReader和PrintWriter类来进行数据的读写。当客户端请求处理完成后,关闭与该客户端的Socket连接。服务器端继续监听新的客户端连接请求,循环执行上述步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值