2016-02-26 134 views
0

我是新来java和网络编程的绝大部分。我想编写一个程序,当我的手机连接到家庭无线网络时,会自动将我的文本备份到我的计算机。Java服务器客户端语义

我正在创建Java类,它将处理通过网络发送数据。使用这里发现的一些问题,我提出了这个实现,但是我对于从中学到的一些方法有一些疑问。

两个问题对于这个代码

  1. 我完全使用一个问题从SO为我的客户端发送的方法。 sendText使用新线程,但sendFile不使用。有什么特别的原因?

2.在代码中的哪个点服务器实际知道何时发送了一条消息到端口?它是在方法 accept()调用还是当BufferStream readLine()被选中?接受只是抓取数据并将其放入缓冲区? null暗示抓取的数据不是从客户端发送的信号?

  1. accept()方法是否会阻止代码的执行,直到从客户端进行连接尝试?

谢谢!

做kserv

//Used to launch the server 
public class KServ { 

    public static void main(String[] args) { 

     if (args.length != 1) { 
      System.err.println("Usage: java KServ <port number>"); 
      System.exit(1); 
     } 

     int port = Integer.parseInt(args[0]); 
     KServer server = new KServer(port); 

     while (true) { //added this to keep the server polling for new data 
      server.run(); 
     } 

    } 

} 

的KServer

//Server class. Should handle data incoming 

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

public class KServer { 

    private int port; 

    public KServer(int PORT) { 
     port = PORT; 
    } 

    public void run() { 

     try (
      ServerSocket sSocket = new ServerSocket(port); 
      Socket cSocket = sSocket.accept(); 
      PrintWriter out = new PrintWriter(cSocket.getOutputStream(), true); 
      BufferedReader in = new BufferedReader(new InputStreamReader(cSocket.getInputStream())); 
     ) { 
      String input; 
      while ((input = in.readLine()) != null) { 

       System.out.println(input); 

      } 
     } catch (IOException e) { 
      System.out.println("Exception caught when trying to listen on port " + port + " or listening for a connection"); 
      System.out.println(e.getMessage()); 
     } 

    } 

} 

客户

//launches KClient object and uses it to send input from console to the server 

import java.util.Scanner; 

public class Client { 
    public static void main(String[] args) { 
     if (args.length != 2) { 
      System.err.println("Usage: java Client <ip number> <port number>"); 
      System.exit(1); 
     } 

     String ip = args[0]; 
     int port = Integer.parseInt(args[1]); 
     KClient client = new KClient(ip,port); 

     String msg; 
     Scanner inStream = new Scanner(System.in); 

     while((msg = inStream.nextLine()).length() > 0) { 
      client.sendText(msg); 
     } 

    } 
} 

KClient

//Will be used to establish connection with server and send data from phone 
import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class KClient { 

    private String server; 
    private int port; 

    public KClient(String Server,int Port) { 
     server = Server; 
     port = Port; 
    } 

    public void sendFile(String fileName) { 

     File file = new File(fileName); 

     FileInputStream fileInputStream; 
     BufferedInputStream bufferedInputStream; 
     OutputStream outputStream; 

     try { 
      client = new Socket(server,port); 

      byte[] bytes = new byte[(int) file.length()]; 
      fileInputStream = new FileInputStream(file); 
      bufferedInputStream = new BufferedInputStream(fileInputStream); 

      bufferedInputStream.read(bytes, 0, bytes.length); 
      outputStream = client.getOutputStream(); 

      outputStream.write(bytes,0,bytes.length); 
      outputStream.flush(); 
      bufferedInputStream.close(); 
      outputStream.close(); 
      client.close(); 

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

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

     } 
    } 

    private Socket client; 
    private OutputStreamWriter outputStreamWriter; 

    public void sendText(String msg) { 
     System.out.println("Send Message!"); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 

       try { 
        client = new Socket(server,port); 
        outputStreamWriter = new OutputStreamWriter(client.getOutputStream(), "ISO-8859-1"); 
        outputStreamWriter.write(msg); 
        outputStreamWriter.flush(); 
        outputStreamWriter.close(); 
       } catch (UnknownHostException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 

    BufferedReader inStream; 

    public boolean Shake() { 

     try { 
      client = new Socket(server,port); 
      inStream = new BufferedReader(new InputStreamReader(client.getInputStream())); 


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

     return true; 

    } 

} 
+1

我打算把这个过于宽泛地关闭,因为你真正要求的是解释网络如何工作,TCP的本质以及它的有效设计。他们撰写有关这些主题的书籍。 –

+0

我会说你的服务器代码有问题 - 它不会同时处理多个连接。除了一个非平凡的例子之外,你不想在接受之后在同一个线程上工作 - 你想把这个套接字传递给另一个线程并回到调用accept来尽快获得下一个连接。 –

+0

谢谢!我意识到我的问题很广泛。我可以删除一些并提出几个具体问题吗? – Chemistpp

回答

0
  1. 我完全使用SO的问题作为我客户端的发送方法。 sendText使用新线程,但sendFile不使用。有什么特别的原因?

无法回答。问作者。两次发送都可以阻止。由于文件大概比文本长,因此反过来做更有意义。

2.在代码中的哪一点,服务器实际上知道何时发送了一条消息到端口?它是在方法调用 accept()

或者是当BufferStream readLine()检查?

是的。

是否接受只抓取数据并将其放入缓冲区?

号它抓起连接并将它作为一个插座。与数据无关。

null意味着抓取的数据不是从客户端发送的信号?

你似乎其实是问BufferedReader.readLine()这里,不ServerSocket.accept(),不返回null。 readLine()在没有未读数据被读取并且对等关闭连接时返回null。

  • 是否直到尝试连接从客户端作出的接受的代码()方法块执行?
  • 或多或少。它会阻塞,直到有一个完整的连接等待被接受,这不完全相同,因为有一个队列。

    我会补充一点,你已经复制或编写了一些真正可怕的代码。有更好的例子。

    +0

    我没有发表评论的答案,问他为什么只选择线程,是的,我认为文件传输会更好的线程,但我知道我不知道的东西。 感谢您的回答。是的,虽然我很确定这是可怕的代码,但我感觉非常好,我用java创建了可以交流的套接字。考虑到3天前,我从来没有使用过套接字,3个月前我从未使用过java,我很开心。 – Chemistpp