[英]simple chat program using java and sockets
我在Java中使用套接字時遇到問題:服務器沒有響應,也沒有拋出異常。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
class Server {
public static void main(String args[]) {
final int time = 75;
//boolean CHAT_SESSION_ALIVE = false;
int port = 9999;
try {
System.out.println("Starting chat server using the port : " + port);
ServerSocket srvr = new ServerSocket(port);
Socket skt = srvr.accept();
System.out.println("Server has connected with client " + skt.getInetAddress());
//CHAT_SESSION_ALIVE = true;
PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
if (in.ready()) {
String msg = in.readLine();
System.out.println("receive message: '" + msg + "'");
Thread.sleep(time);
}
} catch (Exception e) {
System.out.println(e);
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(time);
String msg = new Scanner(System.in).nextLine();
System.out.println("Sending message: '" + msg + "'");
out.print(msg);
} catch (Exception e) {
System.out.println(e);
}
}
}
}).start();
//in.close();
//out.close();
//skt.close();
//srvr.close();
} catch (Exception e) {
System.out.print(e);
}
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
class Client {
public static void main(String args[]) {
final int time = 75;
//boolean CHAT_SESSION_ALIVE = false;
int port = 9999;
String hostIP = "127.0.0.1";
try {
Socket skt = new Socket(hostIP, port);
System.out.println("Client has connected with server " + hostIP + ":" + port);
//CHAT_SESSION_ALIVE = true;
PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
if (in.ready()) {
String msg = in.readLine();
System.out.println("receive message: '" + msg + "'");
Thread.sleep(time);
}
} catch (Exception e) {
System.out.println(e);
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
String msg = new Scanner(System.in).nextLine();
System.out.println("Sending message: '" + msg + "'");
out.print(msg);
Thread.sleep(time);
} catch (Exception e) {
System.out.println(e);
}
}
}
}).start();
//in.close();
//out.close();
//skt.close();
} catch (Exception e) {
System.out.print(e);
}
}
}
服務器輸出:
使用端口啟動聊天服務器:9999
服務器已與客戶端/127.0.0.1連接
客戶輸出:
客戶端已與服務器127.0.0.1:9999連接
簡單的消息
發送消息:'簡單消息'
請解釋服務器無法正常工作的原因。
Scanner.nextLine
返回沒有新行delim的行。 服務器正在使用BufferedReader.readLine
,它需要一個新行(如果沒有收到,則可能會阻塞)。 解決方案:在發送消息時附加分隔符。 如果使用print
,則必須明確刷新:
out.print(msg + "\n");
out.flush();//explicitly flush the stream
或者使用println
方法讓它為你添加新行(並使用傳遞給PrintWriter構造函數的autoflush true
標志):
out.println(msg);//auto flushing
在兩個代碼中,在PrintWriter out
的實例化之后立即放置一個out.flush()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.