如何在Java套接字编程中使用单个服务器创建多个客户端?



我正在尝试遵循Java套接字编程。 我的目标是创建多个客户端线程,这些线程发布其状态 所有这些都由同一服务器侦听。

像这样的东西 1. 服务器已启动 2. 客户端 A 启动 3. 客户端 B 启动 4. 客户 A 对客户 B 说"嗨" 5. 客户B对客户A说"你好" 6. 客户 A 对客户 B 说"Hi2" 7. 客户B对客户A说"Hi2" 8. 客户 A 对客户 B 说"Hi3" 9. 客户 B 对客户 A 说"Hi3" 10. 客户端 A 已完成 11. 客户端 B 已完成

到目前为止,我尝试的是:

  1. 我的服务器.java
import java.net.*;
import java.io.*;
class MyServer
{
public static void main(String args[]) throws Exception
{
ServerSocket server_socket = new ServerSocket(3333);
Socket client_socket = server_socket.accept();
DataInputStream din = new DataInputStream(client_socket.getInputStream());
DataOutputStream dout = new DataOutputStream(client_socket.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = "", str2 = "";
int counter = 0;
while (!str.equals("stop") && counter < 10)
{
str = din.readUTF();
System.out.println("client says: " + str);
//str2 = br.readLine();
str2 = str +"server response ";
dout.writeUTF(str2);
dout.flush();
counter ++;
}
din.close();
client_socket.close();
server_socket.close();
}
}
  1. MyClient.java
import java.util.stream.IntStream;
public class ClientThread implements Runnable
{
String client_name;
public ClientThread(String client_name)
{
this.setClient_name(client_name);
}
public void run()
{
for(int i=0;i<5;i++)
{
System.out.println(this.getClient_name()+" : "+i);
new ClientHelper().sendMessageToServer(this.getClient_name(),i);
try
{
Thread.sleep(1000);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public String getClient_name()
{
return client_name;
}
private void setClient_name(String client_name)
{
this.client_name = client_name;
}

}

3 .客户端助手.java

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientHelper
{
Socket socket;
DataInputStream din ;
DataOutputStream dout ;
public void sendMessageToServer(String player_name, int i)
{
try
{
socket = new Socket("localhost", 3333);
din = new DataInputStream(this.getSocket().getInputStream());
dout = new DataOutputStream(this.getSocket().getOutputStream());
// BufferedReader br = new BufferedReader(new
// InputStreamReader(System.in));
dout.writeUTF(player_name + " : says hi :" + i);
dout.flush();
socket.close();
} catch (UnknownHostException e )
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
} finally
{
}
}
private Socket getSocket()
{
return socket;
}
private void setSocket(Socket socket)
{
this.socket = socket;
}
}
  1. App.java
public class App 
{
public static void main( String[] args )
{
new Thread(new ClientThread("A")).start();
//new Thread(new ClientThread("B")).start();
/*try
{
DataInputStream dataInputStream;
DataOutputStream dataOutputStream;
BufferedReader bufferedReader; 
Socket socket = new Socket("localhost", 12345);
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream = new DataOutputStream(socket.getOutputStream());
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Player p1 = new Player("p1", dataInputStream, dataOutputStream, bufferedReader);
Player p2 = new Player("p2", dataInputStream, dataOutputStream, bufferedReader);
p1.move();
p2.move();
} catch (UnknownHostException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}*/
}
}

它连接一个客户端,但第二个客户端不连接。

你的 MyServer 错了。它只接受一个客户端。

try (ServerSocket s = new ServerSocket(...);) {
while (true) {
Socket conn = s.accept();
conn.getInetAddress().getHostName() + " : " + conn.getPort());
new ServerConnection(conn).start();
}
}
catch(IOException e) {
e.printStackTrace();
}
}

对于每个客户来说,像这样的东西

public class ServerConnection extends Thread {
private Socket client_socket;
public ServerConnection( Socket client_socket) {
this.client_socket = client_socket;
}
public void run() {
DataInputStream din = new DataInputStream(client_socket.getInputStream());
DataOutputStream dout = new DataOutputStream(client_socket.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = "", str2 = "";
int counter = 0;
while (!str.equals("stop") && counter < 10)
{
str = din.readUTF();
System.out.println("client says: " + str);
//str2 = br.readLine();
str2 = str +"server response ";
dout.writeUTF(str2);
dout.flush();
counter ++;
}
din.close();
}
}

最新更新