2015-10-04 158 views
0

我试图让如何使一个Java服务器/客户端程序,但我不明白为什么它不起作用,即使我运行我的服务器的界面不显示在一个单独的线程循环,我设法得到一些端口错误,我甚至不知道该怎么尝试了,所以这里的代码: (我在一台计算机上执行这两个程序)Java简单的TCP客户端/服务器测试冻结

什么是我做错了?

客户端:

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

哉!这是它的感谢!但你知道为什么我的服务器GUI不显示吗? – javaNoob49854

+0

以及为什么每次运行编程时都必须更改端口,或者我在线程“main”java.net.BindException中获取异常:已使用的地址:JVM_Bind? – javaNoob49854

+0

没关系,作为一个白痴从来没有帮助过编程:我使用了thread.run;而不是thread.start(); – javaNoob49854