用于多层服务器can的Java套接字';不要从播放机读取数据

用于多层服务器can的Java套接字';不要从播放机读取数据,java,sockets,processing,serversocket,Java,Sockets,Processing,Serversocket,为了考试,我必须制作一个同步的多层记事本,为了练习服务器端,我决定在两个客户端交换鼠标位置的过程中制作一个小草图 其思想是当两个客户机连接到服务器时,服务器通过这两个连接生成一个线程,在线程中,客户机将数据发送到服务器,服务器将数据发送到客户机,因此服务器是客户机的简单桥梁 这是Java服务器代码: import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import j

为了考试,我必须制作一个同步的多层记事本,为了练习服务器端,我决定在两个客户端交换鼠标位置的过程中制作一个小草图

其思想是当两个客户机连接到服务器时,服务器通过这两个连接生成一个线程,在线程中,客户机将数据发送到服务器,服务器将数据发送到客户机,因此服务器是客户机的简单桥梁

这是Java服务器代码:

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ProvaServerGioco {
    public final static int PORT = 31946;
    public final static int MAXPARTITE = 50;
    private Socket player1;
    private Socket player2;
    public final static char separatore = '\n';
    public static final String INDIRIZZOHAMACHI = "25.166.111.50";
    public static final String INDIRIZZOLAN = "192.168.1.65";

    public void start() throws UnknownHostException {
        ExecutorService pool = Executors.newFixedThreadPool(MAXPARTITE);
        StringBuilder mouse=new StringBuilder();
        InetAddress addr = InetAddress.getByName(INDIRIZZOHAMACHI);
        try (ServerSocket server = new ServerSocket(PORT, 0, addr)) {
            while (true) {
                {
                    if (player1 == null) {
                        try {
                            player1 = server.accept();
                            System.out.println("Ryu");
                            Writer out = new OutputStreamWriter(
                                    player1.getOutputStream());
                            out.write("in attesa di giocatore 2" + separatore);
                            out.flush();
                        } catch (IOException ex) {
                            player1.close();
                            player1 = null;
                        }
                    }
                    if (player2 == null) {
                        try {
                            player2 = server.accept();
                            System.out.println("Ken");
                            Writer out = new OutputStreamWriter(
                                    player2.getOutputStream());
                            out.write("in attesa di giocatore 2" + separatore);
                            out.flush();
                        } catch (IOException ex) {
                            player2.close();
                            player2 = null;
                        }
                    }

                    if(!checkConnessione(player1))
                        player1=null;
                    if(!checkConnessione(player2))
                        player2=null;


                    if (player2 != null && player1 != null) {

                        pool.submit(new ThreadPartita(player1, player2));
                        player1 = null;
                        player2 = null;
                    }

                }

            }
        } catch (IOException ex) {
            System.err.println(ex);

        }

    }

    private boolean checkConnessione(Socket player) {
        if (player != null)
            try {
                Writer out = new OutputStreamWriter(player.getOutputStream());
                out.write(separatore);
                out.flush();
                return true;
            } catch (IOException ex) {
                try {
                    player.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                return false;

            }
        return false;
    }

    public static void main(String[] args) {
        ProvaServerGioco server = new ProvaServerGioco();
        try {
            server.start();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

    }

}
这是比赛的线索:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.util.concurrent.Callable;


public class ThreadPartita implements Callable<Void>{

    private Socket player1;
    private Socket player2;
    private Writer player1Out;
    private Writer player2Out;
    private BufferedReader readerPlayer1;
    private BufferedReader readerPlayer2;
    private boolean finePartita=false;
    public ThreadPartita(Socket player1,Socket player2)
    {
        this.player1=player1;
        this.player2=player2;
    }
    @Override
    public Void call() throws Exception {
        notificaConnessione(player1);
        notificaConnessione(player2);
        player1Out=new OutputStreamWriter(
                player1.getOutputStream());
        player2Out=new OutputStreamWriter(
                player2.getOutputStream());
        readerPlayer1=new BufferedReader(new InputStreamReader(player1.getInputStream(), "ASCII"));
        readerPlayer2=new BufferedReader(new InputStreamReader(player2.getInputStream(), "ASCII"));
        String mousePlayer1="";
        String mousePlayer2="";

        while(true&&!finePartita)
        {
            mousePlayer2=readerPlayer2.readLine();
            mousePlayer1=readerPlayer1.readLine();
            player1Out.write(mousePlayer2+ProvaServerGioco.separatore);
            player1Out.flush();
            System.out.println(mousePlayer1);
            System.out.println(readerPlayer2.ready());


            player2Out.write(mousePlayer1+ProvaServerGioco.separatore);

            player2Out.flush();
        }


        return null;
    }


    private void inviaMessaggio(Socket player,String messaggio) 
    {
        try{
        Writer out = new OutputStreamWriter(
                player.getOutputStream());

        out.write(messaggio);
        out.flush();
        }
        catch(IOException ex)
        {
            System.out.println("partita annullata");
        }
    }


        private void notificaConnessione(Socket player)
        {
            inviaMessaggio(player,"Sei connesso"+ProvaServerGioco.separatore);
        }
}
在这一行中,如果我评论说这一行一切正常,并且player1正确地将数据发送给player2,程序将冻结

我肯定知道这是一个noob错误,但我不知道如何修复它,因为我是一个服务器套接字的初学者(这几天我正在学习o'Reilly的《java网络编程》一书)

我不知道是否有用,但这是客户端正在处理的代码:

import java.net.*;
import java.io.*;
import java.io.Writer;
StringBuilder mouse;
final static int PORTA=31946;
//final static int PORTA=13;
String mouseStringa;
String hamachiIP="127.0.0.1";
Socket socket;
Writer out;
BufferedReader reader;
void setup()
{

  size(800,800);
  try{
  socket = new Socket(hamachiIP, PORTA);
  socket.setSoTimeout(15000);
  out=new OutputStreamWriter(
        socket.getOutputStream());
  InputStream in = socket.getInputStream();
  mouse = new StringBuilder();
  reader = new BufferedReader(new InputStreamReader(in, "ASCII"));
  mouseStringa=reader.readLine();
  }
  catch (IOException ex) 
  {
      System.err.println(ex);
  }
  }

  void draw()
  {
    background(255);

println(mouseStringa);

try{
  mouse = new StringBuilder();
if(reader.ready())
{
  String appoggio=reader.readLine();
  if(appoggio.length()>0)
      mouseStringa=reader.readLine();
 }
  String posizioniMouse=""+mouseX+';'+mouseY+'\n';
  out.write(posizioniMouse);
  out.flush();
  }
  catch (IOException ex) 
  {
      System.err.println(ex);
  }  

    frame.setTitle("fps: "+frameRate);

    }

谢谢你的关注

我相信player2不会传输它的大部分位置,因此,
readLine
会永远阻塞,因为没有什么可读取的。但是我不能测试这个,因为你的客户端代码不完整。请更新客户端代码,以便我可以对其进行测试。客户端代码已完成,可能是因为处理过程中没有生成:
import java.net.*;
import java.io.*;
import java.io.Writer;
StringBuilder mouse;
final static int PORTA=31946;
//final static int PORTA=13;
String mouseStringa;
String hamachiIP="127.0.0.1";
Socket socket;
Writer out;
BufferedReader reader;
void setup()
{

  size(800,800);
  try{
  socket = new Socket(hamachiIP, PORTA);
  socket.setSoTimeout(15000);
  out=new OutputStreamWriter(
        socket.getOutputStream());
  InputStream in = socket.getInputStream();
  mouse = new StringBuilder();
  reader = new BufferedReader(new InputStreamReader(in, "ASCII"));
  mouseStringa=reader.readLine();
  }
  catch (IOException ex) 
  {
      System.err.println(ex);
  }
  }

  void draw()
  {
    background(255);

println(mouseStringa);

try{
  mouse = new StringBuilder();
if(reader.ready())
{
  String appoggio=reader.readLine();
  if(appoggio.length()>0)
      mouseStringa=reader.readLine();
 }
  String posizioniMouse=""+mouseX+';'+mouseY+'\n';
  out.write(posizioniMouse);
  out.flush();
  }
  catch (IOException ex) 
  {
      System.err.println(ex);
  }  

    frame.setTitle("fps: "+frameRate);

    }