2013-05-03 79 views
0

所以,我得到了一个基本的单连接服务器运行,现在我想将其转换为一个多线程服务器的小型多层项目,我想做的事,我完全自学成才的,我做绊倒一些事情,和网络是主要的一个我一直在试图理解了很久了,可能你们能帮助..需要帮助让我的基本的socket服务器工作

问题:当我只有一个线程会writeUTFreadUTF它工作得很好,发送的UTF和关闭连接,虽然现在我已移到了多线程我甚至不知道它的客户端不发送的UTF,服务器不接受UTF,或者服务器不再重新发送UTF,也许你们可以让我知道,这里的代码。

服务器双面代码

Server.java

package TestServer.net; 
/** 
* This is the server class, the server is the main class 
* for instantiating anything related to server-side functionality, 
* the server listens for incoming connections aswell as handles 
* the data transmitted between the two. 
* 
* 
* @author Christian 
*/ 
import java.io.*; 
import java.net.*; 
import java.sql.*; 

import TestServer.net.players.Player; 


public class Server { 
    Player[] player = new Player[Config.MAX_CONNECTIONS]; 
    ServerSocket serverSocket; 
    Socket socket; 
    DataOutputStream out; 
    DataInputStream in; 

public Server() throws IOException { 
    // Open the server on the following port 
    System.out.println("Attempting to setup server..."); 
    serverSocket = new ServerSocket(43594); 
    System.out.println("Server officially setup on port: 43594"); 
    // Tell the server to accept connections 
    while (true) { 
     socket = serverSocket.accept(); 
     for(int i = 0; i < Config.MAX_CONNECTIONS; i++) { 
      System.out.println("Server is waiting for connections..."); 
      System.out.println("Connection from: " +socket.getInetAddress()); 
      // Setup the server to send out data. 
      out = new DataOutputStream(socket.getOutputStream()); 
      in = new DataInputStream(socket.getInputStream()); 
      if(player[i] == null) { 
       player[i] = new Player(out, in, player); 
       Thread thread = new Thread(); 
       thread.start(); 
       break; // End the loop to start listening for more connections 
      } 
     } 
    } 
} 

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

Player.java

package TestServer.net.players; 

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

public class Player implements Runnable { 
Player[] player = new Player[Config.MAX_CONNECTIONS]; 
DataOutputStream out; 
DataInputStream in; 


public Player(DataOutputStream out, DataInputStream in, Player[] player) { 
    this.in = in; 
    this.out = out; 
    this.player = player; 
} 

public void run() { 
    while(true) { 
     try { 
      String message = in.readUTF(); 
      for(int i = 0; i < Config.MAX_CONNECTIONS; i++) { 
       if(player[i] != null) { 
        player[i].out.writeUTF(message); 
       } 
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 
} 

客户双面代码

Client.java

package TestClient.net; 
import java.net.*; 
import java.util.Scanner; 
import java.io.*; 

import TestClient.net.util.Input; 

public class Client { 

Socket socket; 
DataInputStream in; 
DataOutputStream out; 

public Client() throws UnknownHostException, IOException { 
    // Set the client to connect to (IP, Port); 
    System.out.println("Attempting to connect to server on port: 43594"); 
    socket = new Socket("localhost", 43594); 
    System.out.println("Successfully connected to server..."); 
    in = new DataInputStream(socket.getInputStream()); 
    out = new DataOutputStream(socket.getOutputStream()); 
    Input input = new Input(in); 
    Thread thread = new Thread(input); 
    thread.start(); 
    Scanner scanner = new Scanner(System.in); 
    while(true) { 
     String sendMessage = scanner.nextLine(); 
     out.writeUTF(sendMessage); 

    } 
} 

public static void main(String args[]) throws UnknownHostException, IOException { 
    new Client(); 
} 
} 

Input.java

package TestClient.net.util; 


import java.io.DataInputStream; 
import java.io.IOException; 

public class Input implements Runnable { 

    DataInputStream in; 

    public Input(DataInputStream in) { 
     this.in = in; 
    } 

    public void run() { 
     while (true) { 
      String message; 
      try { 
       message = in.readUTF(); 
       System.out.println(message); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
    } 
} 

回答

0

您创建和启动服务器中的Thread对象,但未能通过您的Player可运行它。