Multithread-Server unter Verwendung von TCP in Java
Ich versuche zu implementieren eine einfache TCP-Verbindung zwischen Client/Server. Ich habe die Server multithreaded, so dass es kann nehmen Sie entweder mehrere Anforderungen (wie die Suche nach der Summe, max, min eine Zeichenfolge von zahlen durch den Benutzer bereitgestellt werden) von einem einzigen client oder akzeptieren mehrere verbindungen von verschiedenen clients. Ich bin mit beiden von Ihnen auf meinem Rechner, aber der server scheint nicht, um push-out eine Antwort. Nicht sicher, was ich falsch mache hier --
public final class CalClient {
static final int PORT_NUMBER = 6789;
public static void main (String arg[]) throws Exception
{
String serverName;
@SuppressWarnings("unused")
String strListOfNumbers = null;
int menuIndex;
boolean exit = false;
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Please enter host name...");
System.out.print("> ");
serverName = inFromUser.readLine();
Socket clientSocket = new Socket(serverName, PORT_NUMBER);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
//outToServer.writeBytes(serverName + '\n');
System.out.println("");
System.out.println("Enter 1 to enter the list of numbers");
System.out.println("Enter 2 to perform Summation");
System.out.println("Enter 3 to calculate Maximum");
System.out.println("Enter 4 to calculate Minimum");
System.out.println("Enter 5 to Exit");
while (!exit) {
System.out.print(">");
menuIndex = Integer.parseInt(inFromUser.readLine());
if (menuIndex == 1) {
System.out.println("Please enter the numbers separated by commas.");
System.out.print(">");
strListOfNumbers = inFromUser.readLine();
outToServer.writeBytes("List" + strListOfNumbers);
//continue;
}
else if (menuIndex == 2) {
outToServer.writeBytes("SUM");
System.out.println(inFromServer.readLine());
}
else if (menuIndex == 3) {
outToServer.writeBytes("MAX");
System.out.println(inFromServer.readLine());
}
else if (menuIndex == 4) {
outToServer.writeBytes("MIN");
System.out.println(inFromServer.readLine());
}
else if (menuIndex == 5) {
outToServer.writeBytes("EXIT");
exit = true;
}
}
}
}
public final class CalServer
{
static final int PORT_NUMBER = 6789;
public static void main(String[] args) throws IOException
{
try {
ServerSocket welcomeSocket = new ServerSocket(PORT_NUMBER);
System.out.println("Listening");
while (true) {
Socket connectionSocket = welcomeSocket.accept();
if (connectionSocket != null) {
CalRequest request = new CalRequest(connectionSocket);
Thread thread = new Thread(request);
thread.start();
}
}
} catch (IOException ioe) {
System.out.println("IOException on socket listen: " + ioe);
ioe.printStackTrace();
}
}
}
final class CalRequest implements Runnable
{
Socket socket;
BufferedReader inFromClient;
DataOutputStream outToClient;
TreeSet<Integer> numbers = new TreeSet<Integer>();
int sum = 0;
public CalRequest(Socket socket)
{
this.socket = socket;
}
@Override
public void run()
{
try {
inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
outToClient = new DataOutputStream(socket.getOutputStream());
while(inFromClient.readLine()!= null) {
processRequest(inFromClient.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void processRequest(String string) throws IOException
{
String strAction = string.substring(0,3);
if (strAction.equals("LIS")) {
String strNumbers = string.substring(5);
String[] strNumberArr;
strNumberArr = strNumbers.split(",");
//convert each element of the string array to type Integer and add it to a treeSet container.
for (int i=0; i<strNumberArr.length; i++)
numbers.add(new Integer(Integer.parseInt(strNumberArr[i])));
}
else if (strAction.equals("SUM")) {
@SuppressWarnings("rawtypes")
Iterator it = numbers.iterator();
int total = 0;
while (it.hasNext()) {
total += (Integer)(it.next());
}
}
else if (strAction.equals("MAX")) {
outToClient.writeBytes("The max is: " + Integer.toString(numbers.last()));
}
else if (strAction.equals("MIN")) {
outToClient.writeBytes("The max is: " + Integer.toString(numbers.first()));
}
}
}
- nicht eine Frage zu finden...
- Sorry, ich war zu Bearbeiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie über
readLine()
würde ich vermuten, dass Sie tatsächlich benötigen, senden Zeilenende-Zeichen.Meine Erfahrung mit TCP-socket-Kommunikation verwendet die ASCII-Daten ausschließlich, und mein code widerspiegelt, glaube ich. Wenn das der Fall für Sie, möchten Sie vielleicht versuchen, diese:
Versuchen Sie zunächst, instanziieren Ihre Datenströme so:
Dem true am Ende der printWriter-Konstruktor sagt er zu auto-flush (schöner Begriff) die Puffer wenn Sie ein println.
Wenn Sie tatsächlich nutzen die Steckdose, verwenden Sie die folgende:
Habe ich nicht anfügen, das \n, um die ausgehenden SMS mich, aber das mag an meiner speziellen situation (mehr dazu weiter unten). Die eingehenden Daten muss ein \n am Ende oder readLine funktioniert nicht. Ich nehme an, es gibt Möglichkeiten, wie Sie Lesen konnten, aus der Steckdose, byte für byte, sondern auch, dass der code wäre nicht annähernd so einfach.
Leider, TCP-server, ich bin der Kommunikation mit einem C++ - Programm, so dass die Art und Weise gewährleisten wir die \n vorhanden ist, in der die eingehenden Daten werden nicht für Sie arbeiten wird (Und kann möglicherweise nicht erforderlich sein, die in der ausgehenden Daten).
Schließlich, wenn es hilft, ich baute mein code basiert auf dieser web Beispiel:
http://content.gpwiki.org/index.php/Java:Tutorials:Simple_TCP_Networking
Edit: ich fand ein weiteres code-Beispiel, das verwendet DataOutputStream... Sie finden es möglicherweise hilfreich, wenn Sie es nicht schon gesehen.
http://systembash.com/content/a-simple-java-tcp-server-and-tcp-client/