2014-04-26 185 views
1

您好我是新来的Java套接字,我一直在尝试创建一个服务器套接字。有人可以告诉我哪里出错了,因为我收到错误说“地址已在使用中”。有时我没有得到一个错误,但是它并没有形成连接。请帮助?这是服务器类和客户端类。套接字服务器无连接

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.Writer; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class MessageServer { 
public static void main(String[] args) throws IOException{ 

    int port = 8080; 

    //int port = Integer.parseInt(args[0]); 

    ServerSocket server = new ServerSocket(port); 


    while(true){ 
     System.out.println("Waiting for client..."); 
     Socket client = server.accept(); 

     System.out.println("Client from " + client.getInetAddress() + " connected."); 
     BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     String inputLine = in.readLine(); 
     System.out.println("Client said: '"+inputLine+"'"); 
     Writer count = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
     byte c [] = count.toString().getBytes(); 
     count.flush(); 


     } 
} 

}

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

public class MessageSendClient { 

public static void man(String args[]) throws IOException{ 
    Socket server1 = new Socket("143.210.72.82", 8080); 
    System.out.println("Connected to " + server1.getInetAddress()); 
    InputStream in = server1.getInputStream(); 

    byte c[] = new byte[100]; 
    int num = in.read(c); 
    String count = new String(c); 

    System.out.println("Server said: " + count); 
} 

}

+0

尝试使用“localhost”而不是'143.210.72.82',并且不要使用已用于其他用途的8080端口号。 – Braj

+0

可能你的程序在你每次运行它时都没有关闭套接字,并且套接字只有在套接字超时后才可用。 –

+0

您已经同时运行两次服务器。 – Braj

回答

0

,如果你是在Linux中8080​​/80/8443没有好的端口,我们像3456一样的其他端口。 始终总是关闭你的客户端的套接字。

更新: 首先,你不应该用Server.close()关闭服务器套接字,服务器应该正在运行。这就是为什么Loops在那里。你应该关闭你的客户端套接字,在你从服务器获得输入流之后用socket.close()。还要记住,在write()和flush()之后总是用Close()关闭输出流,以避免副作用。创建两个类,一个用于服务器,另一个用于客户端。首先启动Java类服务器,然后运行您的客户端类以连接到服务器。终止您的客户端类并再次运行它。如果您使用的是eclipse,也可以在控制台中终止客户端。有时候Java过程是重叠的,所以只需用x按钮终止所有正在运行的进程。在改进示例代码之后,可以再次启动“服务器”和“客户端”类。 如果它仍然无法正常工作,则需要再次重新发布您的问题,并在“客户端和服务器的详细信息”中显示当前代码。不知怎的,我已经失去了轨道,你现在的状态在哪里,因为你已经批准了你的问题的答案。

+0

嘿,我就像你说的那样,依然没有联系。它仍在给出“地址已被使用”的错误 – user3576868

+0

您是在同一个Shell中运行客户端主服务器还是服务器主服务器?您应该首先启动服务器主服务器,然后在额外的类调用中启动客户端主服务器。也许用两台不同的电脑来试试这个例子,确保你正确地调用了main。并终止所有活动的旧服务器和客户端。有时您看不到同一端口上的旧服务器仍在运行。 –

+0

是的,早些时候是在大学的电脑上,现在在家里的笔记本电脑上,仍然是同样的问题:( – user3576868

0

不要用你的IP,但使用localhost或127.0.0.1 也尝试一个新的端口,多试1024使用一个端口更大(大多数在这个数字下都是众所周知的端口,并且他们被注册到IANA)

+0

如果创建了连接,则不应该有System.out.println(“Client from”+ client.getInetAddress()+“connected。”); ..? – user3576868

0

尝试一个新的端口。我不会使用8080,因为它可能是(可能已经被使用过)。也请尽量在使用后关闭套接字。

,因为我用的插座自己对大学而言,这里是代码(如果你需要UDP或RMI我可以张贴他们也一样)

public class TCPClient { 
    public static void main(String[] args){ 
    try{ 
     Socket socket = new Socket("127.0.0.1", 6666); 

     PrintWriter data_to_server = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader data_from_server = 
       new BufferedReader(
         new InputStreamReader(socket.getInputStream())); 

     //Schicke Nachricht an Server 
     BufferedReader system_reader = new BufferedReader(new InputStreamReader(System.in)); 
     long start_send = System.nanoTime(); 
     String msg = system_reader.readLine(); 
     data_to_server.println(msg); 

     //Erhalte jeweilige Antwort 
     msg = data_from_server.readLine(); 
     System.out.println("Data from Server : " + msg); 
     System.out.println("Timespan: " + (System.nanoTime()-start_send)); 

     socket.close(); 
    }catch(IOException ioe){ 
     ioe.printStackTrace(); 
    } 
    } 
} 

public static void main(String[] args) { 
    try { 
     TCPServer tcp = new TCPServer(); 
     tcp.initialize(6666); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 

public void initialize(int port) throws IOException { 
    // Erstellen eines Server Sockets 
    ServerSocket server = new ServerSocket(port); 

    while (true) { 
     // Warten bis die Verbindung besteht 
     System.out.println("Waiting for client to connect..."); 
     Socket socket = server.accept(); 

     // Writer für die ausgehende Antwort 
     PrintWriter data_to_client = new PrintWriter(
       socket.getOutputStream(), true); 
     // Reader für die ankommende Nachricht 
     BufferedReader data_from_client = new BufferedReader(
       new InputStreamReader(socket.getInputStream())); 

     // IP-Adresse des Clients 
     InetAddress remoteIp = socket.getInetAddress(); 

     // Erhalten der Nachricht 
     String msg = data_from_client.readLine(); 
     System.out.println("Client " + remoteIp + " : " + msg); 

     // Versenden der Antwort 
     send(data_to_client, msg); 
    } 
} 

}

+0

感谢您的建议,我试着改变这一点,但即时通讯仍然发现创建连接的麻烦。你是否理解“资源泄漏:'服务器'永远不会关闭”的含义? – user3576868

+0

@ user3576868我可以想象的唯一事情是,您没有像我例如(client_socket.close()) – voskart

+0

那样关闭客户端套接字嗨,感谢您的建议。我试图在客户端类上使用server.close(),它仍然不起作用。我仍然在使用地址。这是否意味着我必须再次更改端口号。我现在10000了@voskart – user3576868