这是我第一次进行Socket编程,我制作了一个客户端程序和一个Server程序,服务器只是向客户端发送一条简单的消息。 问题是,当我更改消息时,它将再次显示旧消息。
这是客户
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.net.*;
import java.util.*;
public class Client extends JFrame {
public static final int PORT = 49998;
Client(){
JFrame window = new JFrame();
JPanel thePanel = new JPanel();
JTextField txt = new JTextField(20);
JButton btn = new JButton("Send");
window.add(thePanel);
thePanel.add(txt);
thePanel.add(btn);
window.setSize(400,400);
window.setDefaultCloseOperation(EXIT_ON_CLOSE);
window.setTitle("Client");
window.setVisible(true);
}
public static void main(String[] args){
new Client();
Socket conect;
String ip;
Scanner sc = new Scanner(System.in);
System.out.print("Enter you're IP adress: ");
ip = sc.nextLine();
try{
conect = new Socket(ip,PORT);
BufferedReader read = new BufferedReader(
new InputStreamReader (conect.getInputStream()));
String line = read.readLine();
if(line == null){
System.out.println("Error reading from server");
}
System.out.println();
System.out.println(line);
read.close();
}catch(IOException e){
System.out.println("Can't connect to server");
}
}
}
这是服务器
import java.net.*;
import java.io.*;
import java.util.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Server {
static PrintWriter pw;
Server(){
JFrame window = new JFrame();
JPanel thePanel = new JPanel();
JTextField txt = new JTextField(20);
JButton btn = new JButton("Send");
window.add(thePanel);
thePanel.add(txt);
thePanel.add(btn);
window.setSize(400,400);
window.setTitle("Server");
window.setVisible(true);
}
public static void main(String[] args){
new Server();
ServerSocket server;
Socket connection;
int port = 49998;
try{
server = new ServerSocket(port);
while(true){
connection = server.accept();
sendMsg(connection);
}
}catch(IOException e){
System.out.println("Problem connection to client");
}
}
public static void sendMsg(Socket con){
try{
pw = new PrintWriter(
con.getOutputStream());
pw.println(" this actually work");
//这是消息,如果我改变它的内容它不再工作,除非我改变端口 pw.flush(); pw.close(); } catch(IOException e){ System.out.print(“同意客户端的错误”); } }
}
我还没有对JFrame做任何事情,所以不要注意它。
答案 0 :(得分:1)
我测试了你的代码,它适用于我。
我的意思是......根据您发布的代码,我假设您正在更改源代码中的消息并重新启动服务器,对吧?
我怀疑你刚刚没有停止你的第一个服务器进程,以便它保持端口忙,并且它会一直响应。
这就是我的所作所为:
我怀疑你错过了第8步......你能仔细检查吗? (在这种情况下,您应该看到消息"与客户端的问题连接"在服务器控制台中)
答案 1 :(得分:0)
关闭一切。应用程序告诉操作系统它将侦听特定端口......直到它关闭。
try (ServerSocket server = new ServerSocket(port)) {
while (true) {
try (Socket connection = server.accept()) {
sendMsg(connection);
} catch (IOException e) {
System.out.println("Problem connection to client");
}
}
} catch (IOException e) {
System.out.println("Problem connection for server");
}
try-with-resources将负责关闭。