dragon87211 2011-12-05 17:03
浏览 262
已采纳

java socket 编程遇到的问题

最近初步学习java socket 编程的时候遇到一个问题就是,当客户端向服务端发送数据时,会出现不能输入也不能,程序卡住的现象,尤其是中文,最多输入两行,控制台就不能再输入数据(客户端输入是用system.in来从键盘获取数据)。英文字符还好一些,但也会出现此种状况,百思不得其解!代码如下:[code="java"][/code]
server:
package dragon.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {

/**
 * @param args
 * @throws IOException 
 */

public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
    ServerSocket ss = null;
    PrintWriter out = null;
    BufferedReader in = null;


    try {
        ss = new ServerSocket(1111);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        System.err.println("could not listen port:1111");
        System.exit(1);
        e.printStackTrace();
    }
    Socket inComing = null;
    while(true){
        inComing = ss.accept();
        out = new PrintWriter(inComing.getOutputStream(),true);
        in = new BufferedReader(new InputStreamReader(inComing.getInputStream(),"GBK"));
        out.println("hello!....");
        out.println("enter BYE to exit");
        out.flush();

        while(true){
            String str = in.readLine();
            if(str==null){
                break;
            }
            else{
                out.println("Echo:"+str);
                System.out.println(str);
                out.flush();
                if(str.trim().equalsIgnoreCase("BYE")){
                    break;
                }
            }
        }

        out.close();
        inComing.close();
        ss.close();
    }

}

}
client:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
public static void main(String[] args) throws IOException {
Socket s = null;
PrintWriter out = null;
BufferedReader in = null;

    try {
        s = new Socket("localhost", 1111);
        out = new PrintWriter(s.getOutputStream(),true);
        in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(in.readLine());
    System.out.println(in.readLine());
    BufferedReader stdln = new BufferedReader(new InputStreamReader(System.in));
    String userInput;
    while((userInput=stdln.readLine())!=null){
        out.println(userInput);
        System.out.println(in.readLine());
    }
    out.close();
    in.close();
    s.close();
}

}

  • 写回答

3条回答 默认 最新

  • 飞猪it 2011-12-07 15:10
    关注

    我想是因为,在客户端,你的输入对象是控制台,这个时候控制台就相当于一个记事本了,你想在什么地方输入,就在什么输入,当然是可以输入的地方。例如下一行和已经输入过的地方,因为这戏地方,都有了占位符,一旦你敲入回车键,那么就readLine了,接着就到服务器端了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥30 matlab appdesigner私有函数嵌套整合
  • ¥15 给我一个openharmony跑通webrtc实现视频会议的简单demo项目,sdk为12
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题