Java中Server的线程问题

qq1160286114 2018-09-05 12:49:07
使用两线程一个用来读取客户端的数据一个用来转发客户端数据给所有客户端,为什么在客户端输入第一次数据时候只能进行客户端的读取而进行第二次数据发送诗只能进行客户端所有发送,并按此循环
...全文
326 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dan淡淡的心 2018-09-07
  • 打赏
  • 举报
回复
//线程 @Override public void run() { try { System.out.println(socket.getInetAddress().getHostName()+"已连接"); InputStream inputStream=socket.getInputStream(); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream)); System.out.println(socket.getInetAddress().getHostName()+"给你发来消息:"+bufferedReader.readLine()); socket.shutdownInput(); Scanner scanner=new Scanner(System.in); System.out.print("请回复消息:"); String message=scanner.next(); //这里是阻塞的 所以你服务器收到消息之后只能在这里等着 等你打完字之后再回执行之后的代码 OutputStream outputStream=socket.getOutputStream(); byte [] b=message.getBytes(); outputStream.write(b); outputStream.flush(); } 最后 读取操作也是阻塞的 只有当客户端发来消息之后再回执行之后的代码 然后收不到消息的时候 就无法执行之后的输入操作 也就无法发送信息。反之亦然 所以 最终导致 你只能发一次信息收一次信息才能走下一个回合
verejava 2018-09-07
  • 打赏
  • 举报
回复
qq1160286114 2018-09-05
  • 打赏
  • 举报
回复
就客户端第一次输入 服务器能接收到消息并显示在控制台上但是不进行转发 然后客户端第二次输入时转发了客户端信息但是服务器上没有接受消息
qq1160286114 2018-09-05
  • 打赏
  • 举报
回复
引用 5 楼 Rkj020506 的回复:
楼主是达内的? 。。。。。。
对的
Rkj020506 2018-09-05
  • 打赏
  • 举报
回复
在底下写个ClientHandler 里面写上线程操作 然后转发处理
Gin369 2018-09-05
  • 打赏
  • 举报
回复
开启服务器后端后,调用服务器端的线程,客户端连接后,直接发送消息到服务器端,服务器端跳转到线程服务器端执行

直接给你上代码
//服务器端
ServerSocket serverSocket=new ServerSocket(8888);
System.out.println("服务器已开启,等待连接......");

while(true){
socket=serverSocket.accept();
ConnectSocketServer thread=new ConnectSocketServer(socket);
thread.start();
//线程
@Override
public void run() {
try {
System.out.println(socket.getInetAddress().getHostName()+"已连接");
InputStream inputStream=socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
System.out.println(socket.getInetAddress().getHostName()+"给你发来消息:"+bufferedReader.readLine());
socket.shutdownInput();

Scanner scanner=new Scanner(System.in);
System.out.print("请回复消息:");
String message=scanner.next();
OutputStream outputStream=socket.getOutputStream();
byte [] b=message.getBytes();
outputStream.write(b);
outputStream.flush();
}
//客户端
socket=new Socket("192.168.0.2", 8888);
outputStream=socket.getOutputStream();
System.out.print("请输入文本:");
String message=scanner.next();
//String message="";
byte [] b=message.getBytes();
outputStream.write(b);
outputStream.flush();
socket.shutdownOutput();

InputStream is=socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(is));
System.out.println(bufferedReader.readLine());
Rkj020506 2018-09-05
  • 打赏
  • 举报
回复
楼主是达内的? 。。。。。。
qq1160286114 2018-09-05
  • 打赏
  • 举报
回复
引用 3 楼 Dan淡淡的心 的回复:
你这个代码不全 看不出什么 只有两个读取数据的操作 不过可以给你讲一下这个思路 socket BIO 读写都是阻塞的 所以只能读只能写应该就懂了 一般 读写操作会分为两个线程来处理 一个线程只读 一个线程只写 所以 client跟server至少需要四个线程来处理才能完成整个的读写交流操作
好的我试试,因为教学机没有网络所以只拍了部分截图抱歉
Dan淡淡的心 2018-09-05
  • 打赏
  • 举报
回复
你这个代码不全 看不出什么 只有两个读取数据的操作 不过可以给你讲一下这个思路 socket BIO 读写都是阻塞的 所以只能读只能写应该就懂了 一般 读写操作会分为两个线程来处理 一个线程只读 一个线程只写 所以 client跟server至少需要四个线程来处理才能完成整个的读写交流操作
qq1160286114 2018-09-05
  • 打赏
  • 举报
回复
没大佬帮忙看下吗

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧