繁体   English   中英

Java联网

[英]Java networking

我正在使用Socket制作一个简单的网络。

它工作正常,但问题是它像棋盘游戏一样工作

每次服务器必须等待客户端时,客户端都会等待服务器,依此类推。

每当我从任何一侧输入数据时,我都希望将数据从服务器发送到客户端以及从客户端发送到服务器。

这是我在服务器中的代码的一部分

in = Integer.parseInt(myInputStream.readLine())); // server gets data
out = new Scanner(System.in).nextInt(); 
myOutputStream.println(column);  // server sends data

一句话:线程 您的应用程序在每一端都需要多个线程。 特别是,应该有线程专门用于在每一端维护传入和传出消息的队列,以便想要发送或接收消息的代码不必等待。

这是一个非常大的话题——我无法真正告诉你具体该怎么做。 我推荐 Java 教程的并发章节开始。

Server.java


import java.io.*;

import java.net.*;

public class Server implements Runnable {

String messageIN, messageOUT;
Thread t1 = null, t2 = null;
BufferedReader b1, b2;
ServerSocket ss;
Socket s;
PrintWriter p1;

Server() {
    try {
        ss = new ServerSocket(8000);
        System.out.println();
        System.out.println("Server is Waiting . . . . . ");
        s = ss.accept();
        System.out.println();
        System.out.println("Client Connected ! ! ! ");
        t1 = new Thread(this);
        t2 = new Thread(this);
        t1.start();
        t2.start();
    } catch (Exception e) {
        System.out.println(e);
    }
}
//----------------------------------------------------------------------------------------

public void run() {

    if (Thread.currentThread() == t1) {
        try {
            b1 = new BufferedReader(new InputStreamReader(System.in));
            p1 = new PrintWriter(s.getOutputStream(), true);

            do {
                System.out.println();
                messageIN = b1.readLine();
                System.out.println("Server Says : : : "+messageIN);
                p1.println(messageIN);
            } while (!messageIN.equals("END"));
        } catch (Exception ex) {
        }


    } else {
        try {
            b2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
            do {
                messageOUT = b2.readLine();
                System.out.println("Client Says : : : " + messageOUT);
                System.out.println();
            } while (!messageOUT.equals("END"));
        } catch (Exception e) {
        }
    }
}
//----------------------------------------------------------------------------------------

public static void main(String[] args) {
    new Server();
}
}

//-----------------------------------------------------------------------------------------

客户端.java

import java.io.*;
import java.net.*;



 public class Client implements Runnable {

String messageIN, messageOUT;
Thread thread1 = null, thread2 = null;
BufferedReader br1, br2;
Socket s;
PrintWriter pw;

Client() {
    try {
        System.out.println();
        System.out.println("Going to connect to Server");
        s = new Socket("localhost", 8000);
        System.out.println();
        System.out.println("Connected");
        thread1 = new Thread(this);
        thread2 = new Thread(this);
        thread1.start();
        thread2.start();
    } catch (Exception ex) {
        System.out.println("ex = " + ex);
    }
    }
   //-----------------------------------------------------------------------------------------

  public void run() {
    if (Thread.currentThread() == thread2) {
        try {
            br1 = new BufferedReader(new InputStreamReader(System.in));

            do {
                System.out.println();                    
                messageIN = br1.readLine();
                System.out.println("Client Says : : "+messageIN);
                pw = new PrintWriter(s.getOutputStream(), true);
                pw.println(messageIN);
            } while (!messageIN.equals("END"));
        } catch (Exception ex) {
        }



    } else {
        try {
            do {
                br2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
                messageOUT = br2.readLine();
                System.out.println("Server Says : : : " + messageOUT);
                System.out.println();
            } while (!messageOUT.equals("END"));

        } catch (Exception e) {
        }

    }
 }

//----------------------------------------------------------------------------------------  
public static void main(String[] args) {
    new Client();
}
}

每当我从任何一侧输入数据时,我都希望将数据从服务器发送到客户端以及从客户端发送到服务器。

为了实现上述目的,您需要您的客户端和服务器都是multi-threaded 因此,虽然每一侧的一个线程侦听来自另一对等体的数据,但消息的处理实际上是由另一个线程完成的。

如果您之前没有使用任何语言进行多线程编程,这可能是一项艰巨的任务,所以下面是一个开始的链接:

多线程客户端/服务器应用程序

然后你可以 go 到以下链接以获得更好的构建游戏的想法:

网络编程示例:网络游戏框架

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM