2017-07-02 133 views
-4

我试图创建服务器和客户端之间的双向通信,其中双方(服务器和客户端)可以互相发送消息,而无需等待另一方回复。为此,我创建了一个单独的线程来侦听套接字并在屏幕上打印传入的消息。这是真正的问题:当我运行程序后,我第一次编译和运行服务器和客户端时,一切正常,我从服务器和客户端都收到此错误消息。Java套接字编程,双向通信

java.net.ConnectException: Connection refused (Connection refused) 
at java.net.PlainSocketImpl.socketConnect(Native Method) 
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
at java.net.Socket.connect(Socket.java:589) 
at java.net.Socket.connect(Socket.java:538) 
at java.net.Socket.<init>(Socket.java:434) 
at java.net.Socket.<init>(Socket.java:211) 
at Build.work(c.java:18) 
at s.main(s.java:83) 

Exception in thread "Thread-0" Exception in thread "main" java.lang.NullPointerException 
at Build.run(c.java:59) 
at java.lang.Thread.run(Thread.java:748) 

java.lang.NullPointerException 
at Build.speak(c.java:35) 
at c.main(c.java:85) 

服务器

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

class Build implements Runnable 
{ 
    int port = 3500; 
    String input1; 
    ServerSocket server; 
    Socket socket; 
    DataInputStream in; 
    DataOutputStream out; 
    Console reader; 

    public void work() 
    { 
     try 
     { 
      server = new ServerSocket(port); 
      socket = server.accept(); 
      in = new DataInputStream(socket.getInputStream()); 
      out = new DataOutputStream(socket.getOutputStream()); 
      reader = System.console(); 
     } 

     catch(IOException e){ 
     e.printStackTrace();} 
    } 

    public void speak() 
    { 
     try 
     { 
      while(true) 
      { 
       input1 = reader.readLine(); 
       out.writeUTF(input1); 
       if(input1.equals("stop")) 
       { 
        in.close(); 
        out.close(); 
        socket.close(); 
        server.close(); 
        System.exit(0); 
       }    
      } 
     } 
     catch (IOException e){ 
     e.printStackTrace();} 
    } 

    public void run() 
    { 
     String input2; 

     try 
     { 
      while(true) 
      { 
       input2 = in.readUTF(); 
       System.out.println(input2); 
       if(input2.equals("stop")) 
       { 
        in.close(); 
        out.close(); 
        socket.close(); 
        server.close(); 
        System.exit(0); 
       } 
      } 
     } 
     catch(IOException e){ 
     e.printStackTrace();} 
    } 
} 

public class server 
{ 
    public static void main(String[]args) 
    { 
     Build object = new Build(); 
     object.work(); 
     Thread t1 = new Thread(object); 
     t1.start(); 
     object.speak(); 
    } 
} 

客户

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

class Build implements Runnable 
{ 
    String ip = "127.0.0.1"; 
    int port = 3500; 
    String input1; 
    Socket socket; 
    DataInputStream in; 
    DataOutputStream out; 
    Console reader; 

    public void work() 
    { 
     try 
     { 
      socket = new Socket(ip, port); 
      in = new DataInputStream(socket.getInputStream()); 
      out = new DataOutputStream(socket.getOutputStream()); 
      reader = System.console(); 
     } 

     catch(IOException e){ 
     e.printStackTrace();} 
    } 

    public void speak() 
    { 
     try 
     { 
      while(true) 
      { 
       input1 = reader.readLine(); 
       out.writeUTF(input1); 
       if(input1.equals("stop")) 
       { 
        in.close(); 
        out.close(); 
        socket.close(); 
        System.exit(0); 
       }    
      } 
     } 
     catch (IOException e){ 
     e.printStackTrace();} 
    } 

    public void run() 
    { 
     String input2; 

     try 
     { 
      while(true) 
      { 
       input2 = in.readUTF(); 
       System.out.println(input2); 
       if(input2.equals("stop")) 
       { 
        in.close(); 
        out.close(); 
        socket.close(); 
        System.exit(0); 
       } 
       } 
     } 
     catch(IOException e){ 
     e.printStackTrace();} 
    } 

} 

public class client 
{ 
    public static void main(String[]args) 
    { 
     Build object = new Build(); 
     object.work(); 
     Thread t1 = new Thread(object); 
     t1.start(); 
     object.speak(); 
    } 
} 
+0

@arghavan没有'afterward'这样的词。 – EJP

+0

您的编辑没有“可以随意增加”,它从根本上改变了问题。不要这样做。 – EJP

回答

1

这里没有服务器。服务器将创建一个ServerSocket,然后开始拨打accept()

您在这里只有两个客户。

您也可能在readUTF()readLime()之间感到困惑。 readUTF()只能读取由writeUTF()写入的数据,而readLine()不能。

+0

谢谢指出!格式化代码时,我一定弄错了一些东西。问题仍然存在,我得到相同的错误信息。 EJP是否提出了一个可以创建双向通信的工作解决方案? – Mikey

+0

直到您展示您的当前代码。我们无法读懂你的想法。 – EJP

+0

固定!对不起,麻烦:) – Mikey