2012-11-14 179 views
2

我是新来的Java和我试图学习如何使用套接字。套接字和Java聊天

我试图写一个简单的文本信使,服务器 - 客户端,但我不知道如何使服务器始终侦听客户端的数据流:

这里的服务器代码,现在它只是管理1传入连接,当客户端连接时,服务器发送消息给它:

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

public class SocketServer { 

private InetAddress ServerAddress; 
private int ServerPort; 
private int ServerQueue; 
private ServerSocket Server; 

public SocketServer(String ServerAddress, int ServerPort, int ServerQueue) 
{ 
    try 
    { 
     this.ServerAddress = InetAddress.getByName(ServerAddress); 
    } 
    catch (UnknownHostException uhe) 
    { 
     uhe.printStackTrace(); 
    } 
    this.ServerPort = ServerPort; 
} 

public boolean ServerCreate() 
{ 
    try 
    { 
     Server = new ServerSocket(this.ServerPort, 10, this.ServerAddress); 
     System.out.println("System Message: Server started!"); 
     return true; 
    } 
    catch(IOException ioe) 
    { 
     ioe.printStackTrace(); 
     System.out.println("System Message: Can't start server!"); 
     return false; 
    } 
} 

public void ServerStartListening() 
{ 
    int exit = -1; 
    while(exit < 1) 
    { 
     try 
     { 
      Socket client = this.Server.accept(); 
      OutputStream clientout = client.getOutputStream(); 
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientout)); 
      bw.write("Welcome: "+client.toString()); 
      bw.close(); 
     } 
     catch (IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 
} 

对不起,我的英语不好。

+1

您的目标是听多个客户吗? –

+0

首字母大写的属性是如此混乱.. –

+0

我只想做现在: 1 - 服务器启动 2 - 客户端发送消息至服务器,服务器监听消息 3 - 服务器可以回复或等待另一条消息... –

回答

3

您需要实现多线程才能监听多个传入请求。参考这个link:一个非常好的多线程服务器的例子由oracle

2

你需要阅读的东西。关于线程。这里是一个初始代码:

ServerSocket socketListener; 
DoSthWithThisSocket doSthWithThisSocketObj; 
socketListener = new ServerSocket(LISTENINGPORT); 
Socket socket; 
Thread doSthWithThisSocketThread; 

while (continueSocketListening()) { 
    socket = socketListener.accept(); 
    doSthWithThisSocketObj = new DoSthWithThisSocket(socket); 
    doSthWithThisSocketThread = new Thread(doSthWithThisSocketObj); 
    doSthWithThisSocketThread.start(); 
} 
1

有在Java做多客户端插槽服务器两个主要选项:

  • 开始为每个新客户端的TCP连接一个新的线程为以前的响应建议。这对于小型/玩具服务器来说是可以的,当你刚刚开始玩插座时。这种方法的一大缺点是,这种方法不能扩展 - 只考虑拥有数千个并发客户端...
  • 使用IO多路复用与Java NIO package提供的非阻塞套接字,将接受/读/写事件分派给已注册的回调函数。您可以使用工作项目队列和一组预先分配的工作线程来扩展此功能,以利用硬件中的多个内核/ CPU。