Sha*_*ggy 2 java sockets serversocket
我正在创建一个服务器应用程序,它执行以下任务
我能够连接客户端但无法从客户端接收数据
只有当客户端断开连接时才能在我的控制台中看到数据.. !!!
代码: -
public class ServerListener {
public static void main(String[] args) {
new ServerListener().startServer();
}
public void startServer() {
final ExecutorService clientProcessingPool = Executors
.newFixedThreadPool(10);
Runnable serverTask = new Runnable() {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(8000);
System.out.println("Waiting for clients to connect...");
while (true) {
Socket clientSocket = serverSocket.accept();
clientProcessingPool
.submit(new ClientTask(clientSocket));
}
} catch (IOException e) {
System.err.println("Unable to process client request");
e.printStackTrace();
}
}
};
Thread serverThread = new Thread(serverTask);
serverThread.start();
}
private class ClientTask implements Runnable {
private final Socket clientSocket;
private ClientTask(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
System.out.println("Got a client !");
try {
/* Get Data From Client */
BufferedReader reader = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
String clientData = "";
clientData = reader.readLine();
System.out.println("Data From Client :" + clientData);
/* Send Data To Client */
//Code
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
读一行文字.一条线被认为是由换行符('\n'),回车符('\ r')或回车符中的任何一个终止,后面紧跟换行符.
换句话说,如果您的客户端没有发送\n或\r字符,那么该方法将不会结束,直到IOException因断开连接而被抛出.
替换此代码:
BufferedReader reader = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
String clientData = "";
clientData = reader.readLine();
Run Code Online (Sandbox Code Playgroud)
有:
int red = -1;
byte[] buffer = new byte[5*1024]; // a read buffer of 5KiB
byte[] redData;
StringBuilder clientData = new StringBuilder();
String redDataText;
while ((red = clientSocket.getInputStream().read(buffer)) > -1) {
redData = new byte[red];
System.arraycopy(buffer, 0, redData, 0, red);
redDataText = new String(redData,"UTF-8"); // assumption that client sends data UTF-8 encoded
System.out.println("message part recieved:" + redDataText);
clientData.append(redDataText);
}
System.out.println("Data From Client :" + clientData.toString());
Run Code Online (Sandbox Code Playgroud)
从输入流中读取一些字节数并将它们存储到缓冲区数组b中.实际读取的字节数以整数形式返回.此方法将阻塞,直到输入数据可用,检测到文件结尾或引发异常.
将在执行的确切时刻读取尽可能多的字节 - 它基本上是缓冲读取.由于这些是原始字节,因此在将它们转换为String时,您必须知道其编码才能正确显示它们(即"UTF-8"部分).如果客户端发送字节的编码是其他编码,则可能需要更改它以便在控制台输出中获取正确的文本.
我建议阅读官方教程:
| 归档时间: |
|
| 查看次数: |
22551 次 |
| 最近记录: |