使用java和套接字的简单聊天程序
发布时间:2020-05-25 13:24:23 所属栏目:Java 来源:互联网
导读:我在 Java中使用套接字时遇到问题:服务器没有响应,也没有抛出异常. 服务器代码: import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import jav
|
我在 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);
}
}
}
服务器输出:
客户输出:
请解释服务器无法正常工作的原因. 解决方法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 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
