加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

使用java和套接字的简单聊天程序

发布时间:2020-12-15 00:46:23 所属栏目:Java 来源:网络整理
导读:我在 Java中使用套接字时遇到问题:服务器没有响应,也没有抛出异常. 服务器代码: import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.Sca
我在 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);
        }
    }
}

服务器输出:

Starting chat server using the port : 9999
Server has connected with client /127.0.0.1

客户输出:

Client has connected with server 127.0.0.1:9999
simple message
Sending message: ‘simple message’

请解释服务器无法正常工作的原因.

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读