2015-04-27 69 views
0

我正试图自己实现客户端 - 服务器应用程序。目前为止,除了事实上,当我通过另一个应用程序(例如Web浏览器)访问端口时,服务器应用程序被阻止。Java Socket等待UTF8

如果连接应用程序是“客户端应用程序”,是否有任何简单的方法/好的实践来检查?

下面是侦听端口8080的套接字的简单示例。套接字等待2个字符串。如果您现在连接浏览器(localhost:8080),则连接建立,但正在等待第一个UTF8。

public class MainSocket { 

public static void main(String[] args) { 
    ServerSocket serverSocket; 
    try {    
     serverSocket = new ServerSocket(8080); 
     while (true) { 
      try { 
       Socket clientSocket = serverSocket.accept(); 
       System.out.println("Connection established"); 
       DataInputStream in = new DataInputStream(clientSocket.getInputStream()); 
       System.out.println(in.readUTF()); 
       System.out.println(in.readUTF()); 
       in.close(); 
       clientSocket.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 
+0

DataInputStream是专为读*二进制*数据,而不是文本。我建议使用许多Reader实现之一来阅读文本。 –

回答

1

您在致电DataInputStream.readUTF8。一个期望的数据是这样的:

首先,两个字节被读出并用于构建在readUnsignedShort方法完全相同的方式一个无符号的16位整数。该整数值称为UTF长度,并指定要读取的附加字节数。这些字节然后通过分组考虑将它们转换为字符。每个组的长度根据组的第一个字节的值计算。一个组后面的字节(如果有的话)是下一个组的第一个字节。

(等)

换句话说,这不仅仅是UTF-8。这是UTF-8 上的轻微变化,其长度前缀为。这不是浏览器写入连接的方式。基本上,DataInputDataOutput是对称的,但不完全是通用的 - 它们通常一起使用,一面通过DataInput读取另一面用DataOutput写的内容。

如果你只是想读取UTF-8的线,你可以使用:

try (Reader inputReader = new InputStreamReader(clientSocket.getInputStream(), StandardCharsets.UTF_8); 
    BufferedReader reader = new BufferedReader(inputReader)) { 
    System.out.println(read.readLine()); 
    System.out.println(read.readLine()); 
} 

(现在它不是完全清楚,你应该期待一个浏览器编写UTF-8到插座或者,但以上更可能让你到下一步,我会说...)

+0

感谢您的答复。这正是我面临的问题。在我的客户端应用程序中,我正在向服务器写入2 * UTF和1 *文件。但是现在,如果我通过浏览器访问服务器的端口,则服务器将被阻塞,因为它正在等待第一个readUTF。 –

+0

@AndreasFreitag:嗯,是的 - 如果你的客户端应用程序和浏览器要发出不同的请求,为什么你会尝试在同一个端口上处理它们? –

+0

他们使用不同的端口,但如果用户正在访问8080端口,则服务器被阻止。在真正的服务器应用程序中,我使用了带有10个套接字的套接字池,所以它不是一个大问题。但在我看来,这不是一个好习惯。 –