2014-02-06 237 views
1

TCP服务器TCP线程服务器/客户端

我运行了服务器和客户端,但它似乎只有一个线程正在工作。我应该更改端口还是什么?在此先感谢

我跑了服务器和客户端,但它似乎只有一个线程正在工作。我应该更改端口还是什么?在此先感谢 我跑了服务器和客户端,但它似乎只有一个线程正在工作。我应该更改端口还是什么?在此先感谢 Server代码:

package tcpecho; 

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


class TCPserver implements Runnable { 
private static String clientMSG; 
private static String serverRespond; 
private static ServerSocket MySocket=null; 
private static Socket client; 
private static Socket connectionSocket = null; 
private BufferedReader inFromClient = null; 
public TCPserver(Socket client){ 
    TCPserver.client=client;} 

public static void main(String[] args) { 


public void socketProcess() 
{ 



    try { 
     clientMSG = inFromClient.readLine(); 
    } catch (IOException e) { 
     System.err.println("Message from client is not readable"); 
    } 

    serverRespond = clientMSG +connectionSocket.getInetAddress()+ '\n'; 

    try { 
     outToClient.writeBytes(serverRespond); 
    } catch (IOException e) { 
     System.err.println("Message to client is not out"); 
    } 

    try { 
     MySocket.close(); 
    } catch (IOException e1) { 

     System.err.println("Unable to close the socket"); 
    } 

} 




} 

}

这里是我的客户端代码:

package task3; 

import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.InputStreamReader; 
import java.net.Socket; 

class Client { 
    public static void main(String argv[]) throws Exception { 

     String str; 
     String strFromServer; 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 

     Socket client = null; 
     // for(int i=0;i<10;i++){ 
     int port = 6880; 
     try { 
      client = new Socket("192.168.56.1", port); 
     } catch (Exception e) { 
      System.err.println("Couldn't connect to the port" + port); 
      System.exit(1); 
     } 

     DataOutputStream outToServer = new DataOutputStream(client.getOutputStream()); 

     BufferedReader inFromServer = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     System.out.println("Write a message to the server :"); 
     str = inFromUser.readLine(); 

     outToServer.writeBytes(str + '\n'); 
     strFromServer = inFromServer.readLine(); 
     System.out.println("Respond from server: " + strFromServer); 
     client.close(); 
    } 
} 
+0

一旦你收到答案,不要污蔑你的问题。 –

回答

3

右键你在这之后

connectionSocket = MySocket.accept();

你需要将此connectionSocket实例传递给新线程并在该线程上调用start

此外,移动所有connectionSocket处理逻辑到您的螺纹类的run方法
(这个逻辑是目前在上述这条线之后的main方法)。

为了实现您自己的Thread,您可以扩展Thread或实现Runnable

检查此链接一些更多的细节:Java Threads

+0

另外,你不应该在循环中创建一个新的ServerSocket。创建一次就足够了。 – Kayaman

+0

正确,他应该删除我猜的整个循环。我想他在尝试支持接受多个客户时添加了它。 –

+0

我将connectionSocket传递给了一个新的线程,但是我不能移动run方法中的所有进程,它会抛出很多错误。 – Jason

0

只是一个建议,如果你想有多个线程始终打开,所有的客户端,你可能要检查出java.nio包,它使用非阻塞IO 。

这将允许您处理更多的连接。

+1

线程池呢? – Jason

+0

线程池从程序员的控制中被抽象出来。你通常使用一个nio.channel子类和一个选择器。它与C/C++中的select()函数类似。根据您使用TCP服务器的方式,研究java.nio可能更有优势。 –