有一百万个使用Java套接字的例子 - 每个都是一样的! 每个人都显示正在创建的客户端套接字,正在发送的某些文本以及套接字已关闭。
我正在写一些测试代码。我希望我的客户端循环并发送相当多的消息。每次关闭客户端套接字并重新创建似乎很愚蠢,所以我想我只需要创建一个客户端套接字,循环并在同一个套接字上发送数据。但问题是 - 我的服务器套接字在客户端发送最后一条消息并关闭客户端套接字之前不会打印出它收到的内容。
服务器:
Socket sock;
ClientConnection client;
ServerSocket ss = new ServerSocket(portNumber);
ss.setSoTimeout(0); // 0=infinite
while (true) {
sock = ss.accept();
client = new ClientConnection(sock);
new Thread(client).start();
// ClientConnection reads from sock, prints, and closes sock
}
ClientConnection(服务器端的单独类):
public class ClientConnection implements Runnable
{
private Socket m_socket;
private BufferedReader m_in = null;
public ClientConnection(Socket socket)
{
m_socket = socket;
try {
InputStream inStream = socket.getInputStream();
m_in = new BufferedReader(new InputStreamReader(inStream));
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
public String getMessage()
{
String line = null;
StringBuffer completeMessage = new StringBuffer();
try {
while ((line = m_in.readLine()) != null)
{
completeMessage.append(line);
}
}
catch (IOException ioe) {
ioe.printStackTrace();
return "";
}
return completeMessage.toString();
}
public void run()
{
try {
String message = getMessage();
System.out.println("Received: " +message);
}
finally
{
try {
m_socket.close();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
客户端:
socket = new java.net.Socket(m_destination, m_portNumber);
outputStream = socket.getOutputStream();
printStream = new java.io.PrintStream(outputStream);
while (more-stuff-to-send)
{
printStream.print(text);
printStream.print("\n");
printStream.flush();
}
prinStream.close();
socket.close();
当我启动客户端时,服务器会创建ClientConnection,但在客户端完成发送之前,它不会打印已发送的内容。
我觉得我错过了沿线的某个地方。聊天示例很常见,所以如果我有一个聊天客户端,那么它想要发送到聊天服务器的每条消息都会创建一个客户端套接字,发送消息,然后关闭套接字?只是似乎不正确。
谢谢。
答案 0 :(得分:-1)
client = new ClientConnection(sock);
您正在构造函数中传递套接字。
所以你不应该这样做:
socket = new java.net.Socket(m_destination, m_portNumber);
只需从构造函数缓存该变量为:this.sock = sock;
让读者和作者都没问题,服务器还可以。
我会使用Vector作为同步队列来发送消息,而while (more-stuff-to-send)
循环会检查队列和id是否为空而不是睡眠,如果有东西需要发送,而不是弹出第一个并发送它而必须做东西,或者套接字关闭我的客户端。