このプログラムでは、メッセージを送受信できるはずの2つのファイル(クライアントファイル、サーバーファイル) ) お互いに。各ファイルにはスレッドがあります(クライアント用に1つのスレッド、サーバ用に1つのスレッド)Javaスレッドバインド例外は、すでに使用中のエラー(ソケットを使用しているクライアントサーバー)と組み合わされています。
クライアントとサーバーはローカルホスト上でポート番号で接続します(コマンドプロンプト/ mac端末ウィンドウで入力するときは同じポート番号にする必要があります) )
しかし、サーバーは、クライアントからメッセージを受信した後にのみ、他のすべてのクライアントにメッセージを送信することになっています。言い換えると、クライアントがサーバーにメッセージを送信すると、サーバーはそのメッセージを同じクライアントに送り返すことができず、異なるクライアントにのみメッセージを送信できます。
もう1つの方法:クライアントが接続されると、サーバーにメッセージを送信できます。また、接続された他のクライアントから送信されたメッセージをサーバーから受信します(それ自体から送信されたメッセージではありません)。実行時に
、(MACターミナル/コマンドプロンプトウィンドウを)一つだけのサーバがあるように思われる(MAC端子/コマンドプロンプトウィンドウを)が、クライアントの複数/無限の数があることができ、エラーの
スクリーンショット(サーバー側):エラー(クライアント側の
スクリーンショット):
ChatServer.javaのコード:ChatClient.javaの
import java.io.*;
import java.net.*;
import java.util.*;
import static java.nio.charset.StandardCharsets.*;
public class ChatServer
{
private static Socket socket;
public static void main(String args[])
{
Thread ChatServer1 = new Thread()
{
public void run()
{
System.out.println("Server thread is now running");
try
{
int port_number1 = 0;
int numberOfClients = 0;
boolean KeepRunning = true;
if(args.length>0)
{
port_number1 = Integer.valueOf(args[0]);
}
System.out.println("Waiting for connections on port " + port_number1);
try
{
ServerSocket serverSocket = new ServerSocket(port_number1);
}
catch (IOException e)
{
e.printStackTrace();
}
System.out.println("Listening for connections on port: " + (port_number1));
while(KeepRunning)
{
ServerSocket serverSocket = new ServerSocket(port_number1);
//create a list of clients
ArrayList<String> ListOfClients = new ArrayList<String>();
//connect to client
socket = serverSocket.accept();
//add new client to the list, is this the right way to add a new client? or should it be in a for loop or something?
ListOfClients.add("new client");
numberOfClients += 1;
System.out.println("A client has connected. Waiting for message...");
ListOfClients.add("new client" + numberOfClients);
//reading encoded utf-8 message from client, decoding from utf-8 format
String MessageFromClientEncodedUTF8 = "";
BufferedReader BufReader1 = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
String MessageFromClientDecodedFromUTF8 = BufReader1.readLine();
byte[] bytes = MessageFromClientEncodedUTF8.getBytes("UTF-8");
String MessageFromClientDecodedUTF8 = new String(bytes, "UTF-8");
//relaying message to every other client besides the one it was from
for (int i = 0; i < ListOfClients.size(); i++)
{
if(ListOfClients.get(i)!="new client")
{
String newmessage = null;
String returnMessage = newmessage;
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write(returnMessage + "\n");
System.out.println("Message sent to client: "+returnMessage);
bw.flush();
}
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if (socket != null)
{
socket.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
};
ChatServer1.start();
}
}
コード:
import java.io.*;
import java.net.*;
import java.util.*;
import static java.nio.charset.StandardCharsets.*;
public class ChatClient
{
private static Socket Socket;
static int numberOfClients = 0;
public static void main(String args[])
{
//If I wanted to create multiple clients, would this code go here? OR should the new thread creation be outside the while(true) loop?
while (true)
{
String host = "localhost";
int numberOfClients = 0;
Thread ChatClient1 = new Thread()
{
public void run()
{
try
{
//Client begins, gets port number, listens, connects, prints out messages from other clients
int port = 0;
int port_1number1 = 0;
int numberofmessages = 0;
String[] messagessentbyotherclients = null;
System.out.println("Try block begins..");
System.out.println("Chat client is running");
String port_number1= args[0];
System.out.println("Port number is: " + port_number1);
if(args.length>0)
{
port = Integer.valueOf(port_number1);
}
System.out.println("Listening for connections..");
System.out.println("Listening on port: " + port_number1);
Socket.connect(null);
System.out.println("Client has connected to the server");
for(int i = 0; i < numberOfClients; i++)
{
System.out.println(messagessentbyotherclients);
}
//client creates new message from standard input
OutputStream os = Socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
//creating message to send from standard input
String newmessage = "";
try
{
// input the message from standard input encoded in UTF-8 string format
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String line = "";
System.out.println("Standard input (press enter then control D when finished): ");
while((line= input.readLine()) != null)
{
newmessage += line + " ";
input=null;
}
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
//Sending the message to server
String sendMessage = newmessage;
bw.write(sendMessage + "\n");
bw.flush();
System.out.println("Message sent to server: "+sendMessage);
}
catch (IOException e)
{
e.printStackTrace();
}
}
};
ChatClient1.start();
}
}
}
これらの2つのエラーが何度もカバーされていると私は答えがでソケットを置くことであることを聞きましたすでにループしているループです(whileループ)。
私の質問です:それを実行する前にエラーを見つける方法はありますか?私はプログラムをコンパイルするたびに、私はeclipseで何のエラーも出ませんが、コマンドプロンプトウィンドウ/ mac端末で実行すると何かが間違っていると言います。それとも、私が見落としているコード行がありますか?
コードを浅く見て、いくつかの問題が発生しました。あなたのサーバーでは、 'new ServerSocket(port_number1);を複数回呼びます。その呼び出しを繰り返すたびにバインド例外が発生します。サーバーソケットは一度作成する必要があります。サーバーでは、接続されたクライアントごとに1つのスレッドを作成するか、NIOセレクターを使用する必要があります。そうしないと、サーバースレッドのみがクライアントに参加できなくなります。 – nandsito
プログラムインスタンスごとに1つのクライアントインスタンスを実行すると、同じプログラム内のすべてのクライアントではなく、後者の場合は、クライアントごとに1つのスレッドが必要になり、クライアントコードがはるかに複雑になります。私はあなたのクライアントとサーバーのコードのすべてのアーキテクチャを再考することを強くお勧めします – nandsito
すべてのコメントありがとう、私はこれを検討します。一瞬... –