Java简单的TCP客户端/服务器测试冻结
问题描述:
我试图让如何使一个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("???");
}
}
}
}
}
答
的问题是客户端代码等待来自服务器的新行字符\n
。由于您正在调用流的readLine
。
modifiedSentence = inFromServer.readLine();
解决方案:
更改您的服务器代码如下太写\n
。
outToClient.writeBytes(capitalizedSentence+'\n');
注:我认为你不需要new BufferedReader(new nputStreamReader(System.in))
内actionPerformed()
哉!这是它的感谢!但你知道为什么我的服务器GUI不显示吗? – javaNoob49854
以及为什么每次运行编程时都必须更改端口,或者我在线程“main”java.net.BindException中获取异常:已使用的地址:JVM_Bind? – javaNoob49854
没关系,作为一个白痴从来没有帮助过编程:我使用了thread.run;而不是thread.start(); – javaNoob49854