Java Socket Chat, некоторые сообщения не отправляются

Недавно я начал изучать сокеты и другие сетевые устройства, как это работает, я сделал простую программу чата с графическим интерфейсом, она работает несколько, проблема в том, что если при заказе сообщения для отправки на сервер клиент должен поместить одно и то же сообщение дважды, и если сервер отправляет сообщение, клиент должен ответить один раз.

Вот мой класс клиент / сервер:

package org.codingllamas.Chat;

import java.io.*;
import java.net.*;

import javax.swing.text.BadLocationException;
import javax.swing.text.html.HTML;

public class SC {

static Socket clientSocket;
static BufferedReader inFromServer;
static DataOutputStream outToServer;

public static void clientSetup(int port,String ip) throws IOException, BadLocationException {
     String modifiedSentence;
     Start.kit.insertHTML(Start.doc,Start.doc.getLength(),"<b>Connected to </b>" + ip + ":" + port + "<br>",0,0,HTML.Tag.B);
     while (true) {
     ///BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
     clientSocket = new Socket(ip,port);
     outToServer = new DataOutputStream(clientSocket.getOutputStream());
     inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
     modifiedSentence = inFromServer.readLine();     
     //System.out.println(modifiedSentence);
     Start.kit.insertHTML(Start.doc,Start.doc.getLength(),"<b>Server: </b>" + modifiedSentence + "<br>",0,0,HTML.Tag.B);
     //clientSocket.close();
     }
}

public static void clientSend(String msg) throws IOException, BadLocationException{
    outToServer.writeBytes(msg + "\r");
    outToServer.flush();
    Start.kit.insertHTML(Start.doc,Start.doc.getLength(),"<b>You: </b>" + msg + "<br>",0,0,HTML.Tag.B);
}

static ServerSocket welcomeSocket;
static Socket connectionSocket;
static BufferedReader inFromClient;
static DataOutputStream outToClient;

public static void serverSetup(int port) throws Exception {
    String clientSentence;
    welcomeSocket = new ServerSocket(port);
    Start.kit.insertHTML(Start.doc,Start.doc.getLength(),"<b>Server Started on port: " + port + "</b><br>",0,0,HTML.Tag.B);
    while(true){
       connectionSocket = welcomeSocket.accept();
       inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
       clientSentence = inFromClient.readLine();
       outToClient = new DataOutputStream(connectionSocket.getOutputStream());

       Start.kit.insertHTML(Start.doc,Start.doc.getLength(),"<b>Parther: </b>" + inFromClient.readLine() + "<br>",0,0,HTML.Tag.B);
    }
}

public static void serverSend(String msg) throws IOException, BadLocationException {
    //DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
    outToClient.writeBytes(msg + "\r");
    outToClient.flush();

    Start.kit.insertHTML(Start.doc,Start.doc.getLength(),"<b>You: </b>" + msg + "<br>",0,0,HTML.Tag.B);
}
}

И картинка:

введите описание изображения здесь

Заранее спасибо.

1 ответ

  1. Не используйте DataOutputStream, использовать BufferedWriter.
  2. Не создавайте новый сокет в соответствии с modifiedSentence?: использовать один Socket для жизни клиента, и цикла чтения строк, и закройте сокет, когда вы получите ноль.
  3. Не читайте ни одной строки от клиента за accept(): начать новый поток для чтения строк, как сейчас делает клиент.
Другие вопросы по тегам