2011-03-31 43 views
2

我在使用Java中的套接字时遇到了一些问题。我正在创建一个不断需要将数据发送到服务器的应用程序。数据通过客户端的套接字发送。我正在使用以下代码:如何在Java中使用套接字

serverAddr = InetAddress.getByName(ipAddress); 

while(send) 
{ 
    soc=new Socket(serverAddr,8210); 
    outStream=soc.getOutputStream(); 
    outStream.write(data); 
    outStream.close(); 
} 

上述代码工作正常,没有问题。 这里我在每个循环中创建一个Socket的新对象,我认为这不是一个好的实现方法。如何使用一个Socket将数据发送到服务器? (我不希望创建在每一个循环的新对象)

这里是我写在C#服务器的代码:

while (true) 
{ 
    Socket s = listener.AcceptSocket(); 
    NetworkStream ns = new NetworkStream(s); 
    int d; 
    while ((d = ns.ReadByte()) >= 0) 
    { 
     //Process data here 
    } 
    s.Close(); 
} 

而且我需要在服务器端做什么修改?

感谢

+1

在单个流上发送多条消息,并在多个流上发送1条消息之间存在一些根本区别;特别是您的“过程数据在这里”需要能够正确区分不同的消息。你可能已经有这个覆盖了...我只是提到它是彻底的 – 2011-03-31 07:12:35

+0

@Marc,在这种情况下消息是分开的,因为他为每个消息打开一个新的套接字。非常低效,但它确实分解了邮件;) – 2011-03-31 07:15:15

+0

@Peter - exactly;如果他切换到一个套接字,则会发生变化。根据消息格式的不同,*可能会很好,或者*可能需要调整 - 例如每条消息的长度前缀 – 2011-03-31 07:18:36

回答

2

请记住,创建一个新的Socket对象也将创造新的TCP连接。如果您想使用单个连接,请保留输出流。您需要考虑清理异常,并且如果两者之间存在暂时的网络故障,您可能还需要在此附加一层进行恢复。

serverAddr = InetAddress.getByName(ipAddress); 


soc=new Socket(serverAddr,8210); 
try { 
    outStream=soc.getOutputStream(); 
    while(send) 
    { 
     outStream.write(data); 
    } 
    outStream.close(); 
} finally { 
    soc.close(); 
} 

对于服务器端:你的代码基本上是正确的,但你还需要考虑清理(用using),和马克·Gravell指出的那样,你需要确保你能当发现消息边界正在使用单个TCP连接。

+0

谢谢,它只是帮助我找到一个正确的方式... :) – 2011-03-31 08:33:56

相关问题