【问题标题】:Simple client server program not working简单的客户端服务器程序不起作用
【发布时间】:2013-11-06 08:18:24
【问题描述】:

服务器程序:

import java.io.*;
import java.net.*;
public class server
{
        public static void main(String args[])
        {
                try
                {
                ServerSocket ss=new ServerSocket(2000);
                Socket s=ss.accept();
                BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
                String str;
                while((str=br.readLine())!=null)
                {
                        System.out.println(str);
                }
                }
                catch(Exception e)
                {
                        System.out.println(e);
                }
        }
}

客户端程序:

import java.net.*;
import java.io.*;
public class client
{
        public static void main(String args[])
        {
                try
                {
                Socket s=new Socket("127.0.0.1",2000);
                String str;
                BufferedWriter br=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                br.write("\nHello World\n");
                }
                catch(Exception e)
                {
                        System.out.println(e);
                }
        }
}

我面临的问题是:

  1. 没有输出。
  2. 未指示异常/错误。

如果我做错了什么,请解释我。问题可能是客户端在服务器读取时没有写入任何内容。

【问题讨论】:

  • 试试flush()你的BufferedWriter
  • 如果我的回答解决了您的问题,那么您可以选择我的回答

标签: java sockets serversocket bufferedwriter


【解决方案1】:

在客户端程序中写入流后关闭流 br.close();

写入流后,必须关闭流或刷新流(br.flush()),因为当流关闭时,只能读取该流。 不能同时对同一流执行 I/O 操作。

两个套接字由同一个流连接,因此不能在该流上同时执行 I/O 操作。

【讨论】:

    【解决方案2】:

    请添加一些调试语句进行检查

    (1) 客户端能否与正在运行的服务器建立连接。所以在服务器部分添加

    Socket s=ss.accept();
    System.out.println("one new connection");
    

    (2) 同样在客户端程序中,在 br.write 行之后添加 flush()

     br.write("\nHello World\n");
     br.flush()
    
     // use the below statement as well at last (if you no longer want to use the output stream)
     br.close();
    

    请注意,您只是在这里写一次....为了连续阅读和写作,您必须循环运行.... 或者 同时运行多个客户端......你将不得不在服务器端将每个套接字连接(接受它之后)执行到不同的线程中

    【讨论】:

    • 竖起大拇指索尼!但是为什么?你能解释一下吗?
    • 由于内存优化的目的,JAVA 不会在每个 write() 语句之后写入。它只是将写入的数据存储到缓冲区(内存块)中......并且由于该缓冲区将变满...... java会将其写入套接字......通过刷新您立即写入它而无需等待缓冲区填满。通常缓冲区大小将是 1024 字节的倍数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多