2015-10-04 6 views
0

Я пытаюсь получить, как сделать java-сервер/клиентскую программу, но я не понимаю, почему это не работает, интерфейс моего сервера не отображается, хотя я запускаю цикл в отдельном потоке, и в какой-то момент мне удалось получить ошибки портов, я даже не знаю, что попробовать, так вот вот код: (я выполнил обе программы на одном компьютере)Java простой TCP клиент/сервер test freezes

что я Я делаю неправильно?

клиент:

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 


public class Client extends JFrame { 

String sentence; 
String modifiedSentence; 
int port = 6791; 

JTextField tf = new JTextField(); 
JButton valider = new JButton("Send"); 
JLabel retour = new JLabel("nothing"); 

Socket clientSocket; 
DataOutputStream outToServer; 
BufferedReader inFromServer; 


public Client() throws UnknownHostException, IOException{ 

    this.setSize(200, 130); 
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    this.setTitle("Client"); 
    this.setResizable(false); 




    JPanel zoneclient = (JPanel)getContentPane(); 

    Dimension d = new Dimension(300 , 25); 
    tf.setPreferredSize(d); 
    tf.setMaximumSize(d); 
    retour.setPreferredSize(d); 
    valider.setPreferredSize(d); 

    zoneclient.setLayout(new BoxLayout(zoneclient, BoxLayout.Y_AXIS)); 
    zoneclient.add(new JLabel("Client")); 
    zoneclient.add(tf); 
    zoneclient.add(retour); 
    zoneclient.add(valider); 



    valider.addActionListener(new appActionListener()); 






} 

class appActionListener implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 
     sentence = tf.getText(); 

     try { 

      BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 



      clientSocket = new Socket("localhost", port); 
      clientSocket.setReuseAddress(true); 

      outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
      inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     } catch (Exception f) { 
      // TODO: handle exception 
      System.out.println("connexion failed"); 
     } 

     try { 
      outToServer.writeBytes(sentence + '\n'); 
      modifiedSentence = inFromServer.readLine(); 
      retour.setText(modifiedSentence); 
      clientSocket.close(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
       e1.printStackTrace(); 
       tf.setText("error"); 
      } 

     } 

} 

} 

и вот сервер:

package server; 

import java.awt.Dimension; 
import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

class MyServer extends JFrame{ 

    ServerSocket welcomeSocket; 

    String clientSentence; 
    String capitalizedSentence; 
    JLabel retour = new JLabel("nothing"); 

    public MyServer() throws IOException{ 

     System.out.println("server started"); 
     this.setSize(200, 130); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.setTitle("Server"); 
     this.setResizable(false); 

     JPanel zoneclient = (JPanel)getContentPane(); 

     Dimension d = new Dimension(300 , 25); 

     retour.setPreferredSize(d); 

     zoneclient.setLayout(new BoxLayout(zoneclient, BoxLayout.Y_AXIS)); 
     zoneclient.add(new JLabel("Server")); 
     zoneclient.add(retour); 


     welcomeSocket = new ServerSocket(6791); 
     welcomeSocket.setReuseAddress(true); 
     MyThread th = new MyThread(); 
     th.run(); 
    } 


    class MyThread extends Thread{ 
     public void run(){ 
      while (true) { 
       Socket connectionSocket; 
       try { 
        connectionSocket = welcomeSocket.accept(); 
        BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
        DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
        clientSentence = inFromClient.readLine(); 
        retour.setText("Received: " + clientSentence); 
        capitalizedSentence = clientSentence.toUpperCase(); 
        outToClient.writeBytes(capitalizedSentence); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        System.out.println("???"); 
       } 
      } 
     } 
    } 
} 

ответ

1

Проблема заключается в код клиента ожидания для новой строки \n от сервера. Поскольку вы вызываете readLine потока.

modifiedSentence = inFromServer.readLine(); 

Решение:

Изменить код сервера, чтобы написать \n тоже, как показано ниже.

outToClient.writeBytes(capitalizedSentence+'\n'); 

Примечание: Я думаю, вам не нужно new BufferedReader(new nputStreamReader(System.in)) внутри actionPerformed()

+0

в самом деле! это было спасибо! но знаете ли вы, почему мой графический интерфейс сервера не отображается? – javaNoob49854

+0

и почему я должен менять порты каждый раз, когда запускаю прог или получаю исключение в потоке «main» java.net.BindException: адрес уже используется: JVM_Bind? – javaNoob49854

+0

ok nevermind, будучи идиотом, никогда не помогал в программировании: я использовал thread.run; вместо thread.start(); – javaNoob49854

Смежные вопросы