java服务器/客户端字符串延迟

edqdpe6u  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(434)

我正在创建一个局域网游戏,它接受字符串并从结构化英语中解析它们,并将它们显示在网格上。我已经创建了服务器和客户端,它的工作,但我有一些问题。当我发送一个字符串时,它不会立即出现在另一台机器上。由于某些原因,字符串只在另一台机器发送某些内容时才会发送到另一台机器。我不知道为什么会这样。你能帮我找出为什么不能马上寄出去吗。谢谢
服务器代码:

  1. import java.awt.Point;
  2. import javax.swing.*;
  3. import javax.swing.event.ListSelectionEvent;
  4. import javax.swing.event.ListSelectionListener;
  5. import java.awt.*;
  6. import java.awt.event.*;
  7. import java.io.*;
  8. import java.net.*;
  9. public class studentServer{
  10. static ServerSocket serverSocket;
  11. static Socket socket;
  12. static PrintWriter printWriter;
  13. static BufferedReader bufferedReader;
  14. static Thread thread;
  15. Console console = new Console();
  16. public ServerPlayergameMain gm;
  17. public static void main(String args[]) throws Exception{
  18. }
  19. public void run(String commandMessage){
  20. while(true){
  21. try{
  22. printWriter.println(commandMessage+"\n");
  23. String input = bufferedReader.readLine();//reads the input from textfield
  24. console.readLine("Client message: "+input);//Append to TextArea
  25. }catch(Exception e){}
  26. }
  27. }
  28. public void serverStartActionPerformed() {
  29. System.out.println("Server has started!");
  30. try{
  31. serverSocket = new ServerSocket (8888); // socket for the server
  32. socket = serverSocket.accept(); // waiting for socket to accept client
  33. JOptionPane.showMessageDialog(null, "Your opponent has connected!", "Opponent Connection!", JOptionPane.INFORMATION_MESSAGE);
  34. gm = new ServerPlayergameMain();
  35. gm.setVisible(true);
  36. bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); // reads line from input streamer
  37. printWriter = new PrintWriter(socket.getOutputStream(),true);
  38. }catch(IOException | HeadlessException e){
  39. System.out.println("Server not running!"); //print message if server is not running
  40. }
  41. }
  42. }

客户代码:

  1. import java.io.*;
  2. import java.net.*;
  3. import javax.swing.JOptionPane;
  4. public class StudentClient {
  5. static Socket socket;
  6. static PrintWriter printWriter;
  7. static BufferedReader bufferedReader;
  8. static Thread thread;
  9. Console console = new Console();
  10. public ClientPlayergameMain gm;
  11. public void Clients(String address) {
  12. try{
  13. socket=new Socket("localhost",8888);//Socket for client
  14. //below line reads input from InputStreamReader
  15. bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
  16. //below line writes output to OutPutStream
  17. printWriter=new PrintWriter(socket.getOutputStream(),true);
  18. JOptionPane.showMessageDialog(null, "Connected to server successfully", "Success", JOptionPane.INFORMATION_MESSAGE);
  19. gm = new ClientPlayergameMain();
  20. gm.setVisible(true);
  21. System.out.println("Connected");//debug code
  22. }catch(Exception e){
  23. JOptionPane.showMessageDialog(null, "No Connection to server", "Error", JOptionPane.ERROR_MESSAGE);
  24. System.out.println("Not Connected");
  25. }
  26. }
  27. public static void run(String commandMessage){
  28. while(true){
  29. try{
  30. printWriter.println(commandMessage+"\n");
  31. String input = bufferedReader.readLine();
  32. System.out.println("From server:" +input);
  33. }catch(Exception e) {}
  34. }
  35. }
  36. }

代码工作,但我不知道为什么有一个条件,为其他机器发送的东西。
谢谢你的时间。

rur96b6h

rur96b6h1#

你试过了吗 printWriter.flush() 每次写入/打印后?

rmbxnbpk

rmbxnbpk2#

你的代码中有很多编译问题。某些类和对象丢失,无法解析。
但我还是试着找出问题所在。
原因可能是:
发送新行字符 \nprintWriter.println(commandMessage+"\n"); 声明,删除 \n .
客户机和服务器都是先写的 printWriter.println(commandMessage+"\n"); 陈述,让它在任何一堂课上都是最后的
代码如下:
studentserver.java文件:

  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.io.PrintWriter;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;
  6. public class StudentServer {
  7. static ServerSocket serverSocket;
  8. static Socket socket;
  9. static PrintWriter printWriter;
  10. static BufferedReader bufferedReader;
  11. static Thread thread;
  12. public static void main(String args[]) throws Exception {
  13. StudentServer studentServer = new StudentServer();
  14. studentServer.serverStartActionPerformed();
  15. studentServer.run("server");
  16. }
  17. public void run(String commandMessage) {
  18. if (true) {
  19. try {
  20. printWriter.println(commandMessage);
  21. String input = bufferedReader.readLine();// reads the input from textfield
  22. System.out.println("Client message: " + input);// Append to TextArea
  23. } catch (Exception e) {
  24. }
  25. }
  26. }
  27. public void serverStartActionPerformed() {
  28. System.out.println("Server has started!");
  29. try {
  30. serverSocket = new ServerSocket(8888); // socket for the server
  31. socket = serverSocket.accept(); // waiting for socket to accept client
  32. bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); // reads
  33. // line
  34. // from
  35. // input
  36. // streamer
  37. printWriter = new PrintWriter(socket.getOutputStream(), true);
  38. } catch (Exception e) {
  39. e.printStackTrace();
  40. System.out.println("Server not running!"); // print message if server is not running
  41. }
  42. }
  43. }

studentclient.java文件:

  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.io.PrintWriter;
  4. import java.net.Socket;
  5. public class StudentClient {
  6. static Socket socket;
  7. static PrintWriter printWriter;
  8. static BufferedReader bufferedReader;
  9. static Thread thread;
  10. public void clients() {
  11. try {
  12. socket = new Socket("localhost", 8888);// Socket for client
  13. // below line reads input from InputStreamReader
  14. bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  15. // below line writes output to OutPutStream
  16. printWriter = new PrintWriter(socket.getOutputStream(), true);
  17. System.out.println("Connected");// debug code
  18. } catch (Exception e) {
  19. System.out.println("Not Connected");
  20. }
  21. }
  22. public void run(String commandMessage) {
  23. if (true) {
  24. try {
  25. String input = bufferedReader.readLine();
  26. System.out.println("From server:" + input);
  27. printWriter.println(commandMessage);
  28. } catch (Exception e) {
  29. }
  30. }
  31. }
  32. public static void main(String args[]) throws Exception {
  33. StudentClient studentClient = new StudentClient();
  34. studentClient.clients();
  35. studentClient.run("client");
  36. }
  37. }
展开查看全部
dgsult0t

dgsult0t3#

正如布拉吉指出的,这里有很多小问题。在服务器端,主要的顺序如下:

  1. serverSocket = new ServerSocket (8888); // socket for the server
  2. socket = serverSocket.accept(); // BLOCKS waiting for socket to accept client
  3. // ..
  4. printWriter = new PrintWriter(socket.getOutputStream(),true);

这意味着 printWriter 在服务器侦听、阻止等待并接受来自客户端的连接之前,它甚至不存在。
如果您想打开连接进行读写,而不想从客户端发送任何信息,请从客户端发送握手。您可以复制smtp,并使用 HELO <myname> . 甚至告诉服务器是谁在打电话。
进一步阅读后更新:
我一直都像你一样,使用隐式连接,当你使用 getOutputStream() 在客户端。然而, Socket 允许您使用socket#connect()手动连接现有的套接字。试试看,对你来说,也许比握手更有效。

相关问题