【发布时间】:2012-04-26 08:53:53
【问题描述】:
我的最后一个课程项目是制作一款游戏,包括多人游戏。所以我开始尝试弄清楚 java 网络,但我有点卡住了。
两个游戏客户端中的每一个都需要能够与另一个客户端发送和接收消息。
我想我会处理这个问题的方式是我有一个 NetworkServer 和 NetworkClient 对象,它们在它们自己的线程中运行。
我想我会从我的主游戏应用程序中启动它们,但我想先做一些测试,所以我设置了这个项目:
网络客户端:
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
public class NetworkClient extends Thread {
Socket server;
ObjectOutputStream out;
Timer timer;
public NetworkClient(String hostname, int port) throws IOException
{
server = new Socket(hostname, port);
out = new ObjectOutputStream(server.getOutputStream());
timer = new Timer();
timer.schedule(new SendTask(), 0, 1*1000);
}
public void sendData(Integer b) throws IOException {
out.writeObject(b);
}
class SendTask extends TimerTask {
Integer i = new Integer(1);
public void run() {
System.out.println("Client: Sending Integer: " + i.toString());
try {
sendData(i);
i = new Integer(i.intValue()+1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // run()
} // class SendTask
}
网络服务器:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class NetworkServer extends Thread {
private ServerSocket serverSocket;
private Socket client;
private Integer i;
private ObjectInputStream in;
public NetworkServer(int port) throws IOException
{
serverSocket = new ServerSocket(port);
//serverSocket.setSoTimeout(10000);
}
public void run()
{
try {
System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
client = serverSocket.accept();
System.out.println("Just connected to " + client.getRemoteSocketAddress());
in = new ObjectInputStream(client.getInputStream());
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
while(true)
{
try
{
i = (Integer) in.readObject();
System.out.println("Server: Received the integer: " + i.toString());
}
catch(SocketTimeoutException s)
{
System.out.println("Socket timed out!");
break;
}
catch(IOException e)
{
e.printStackTrace();
try { client.close();} catch (IOException e1) {}
break;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
网络(我用来测试的东西):
import java.io.IOException;
public class Network {
NetworkClient client;
NetworkServer server;
public Network() throws IOException {
server = new NetworkServer(6066);
server.start();
client = new NetworkClient("192.168.1.196", 6066);
client.start();
}
public static void main(String [] args)
{
try
{
Network n = new Network();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
我在那里有一个计时器,以方便将数据从客户端发送到服务器,这通常由我的游戏完成,但由于我正在测试,我必须让它以某种方式发送。
当我在客户端和服务器相互通信的情况下运行此程序时,我会同时收到 Sent 和 Received 消息。
当我把它放在我的笔记本电脑上(并在 NetworkClient 中更改 IP 以匹配我的桌面,反之亦然)并在两个地方运行它时,桌面上的客户端会发送到笔记本电脑上的服务器,但是笔记本电脑上的客户端不会发送到桌面上的服务器。
在运行过程中的某个时刻,我收到一个异常,即客户端的连接被对等方重置,尽管工作的客户端/服务器连接仍在继续。
所以,我想我的问题是,有谁知道为什么它在一个方向上起作用而不是双向?
已修复!!
编辑:哎呀,我想通了。这与启动两个服务器的时间有关。
我将网络更改为:
import java.io.IOException;
public class Network {
NetworkClient client;
NetworkServer server;
public Network() throws IOException {
startServer();
startClient();
}
private void startServer() throws IOException {
server = new NetworkServer(6066);
server.start();
}
private void startClient(){
boolean isConnected = false;
while (!isConnected) {
try {
client = new NetworkClient("192.168.1.196", 6066);
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
continue;
}
isConnected = true;
}
client.start();
}
public static void main(String [] args)
{
try
{
Network n = new Network();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
【问题讨论】:
标签: java sockets networking serversocket