为了账号安全,请及时绑定邮箱和手机立即绑定

请教老师一个问题?服务器端有accpet()函数等待客户端响应,但客户端没有accpet()函数来监听,服务器端又没有进行消息推送,客户端获得消息是啥时触发的

我调试了一下,客户端的socket.shutdownOutput()会触发serverSocket.accept();可是服务器线程是如何保证在向客户端写入“欢迎你”后客户端才会进行数据流的读入。求解。。。。


正在回答

7 回答

accept()方法是服务器端方法,是用来监听某个端口是否收到连接请求,这都没建立连接呢,发送啥数据。

至于说客户端获得服务器的响应,那是连接建立之后,getInputStream()方法可以获取输入流,这个方法是阻塞的,就是调用之后会一直等待数据到来。

客户端和服务器的socket你都没搞清楚吧!

客户端socket.shutdownOutput()之后,服务器知道这个客户端不会再发送数据了,如果服务器的数据也已经发送完毕,连接就会断开,服务器重新调用accept()方法,继续监听端口。

1 回复 有任何疑惑可以回复我~
#1

qq_曾经有个秘密_0 提问者

非常感谢!
2015-01-27 回复 有任何疑惑可以回复我~
#2

qq_曾经有个秘密_0 提问者

情况好像是getInputStream()方法是阻塞的,调用之后会一直等待数据到来。不过它怎样实现阻塞的,是getInputStream()重新开了新线程,还是此客户端线程阻塞了?有没有实现阻塞的具体语句块代码?
2015-01-27 回复 有任何疑惑可以回复我~
#3

qq_曾经有个秘密_0 提问者

我学的不是很深,还请大神讲的详细点,谢谢哈!
2015-01-27 回复 有任何疑惑可以回复我~
#4

仗剑闯江湖 回复 qq_曾经有个秘密_0 提问者

或许你可以看看这个方法的源码,会牵涉到底层的网络协议,具体的过程我也不是很清楚,单从功能实现的角度,不用过多关注实现的细节,除非你想自己改写或者增加一些功能模块,那样的话你需要对计算机网络非常熟悉。
2015-01-27 回复 有任何疑惑可以回复我~
查看1条回复

楼上正解

0 回复 有任何疑惑可以回复我~

以前再学校里面学过一点点socket,现在听过老师讲的课后又编写了一遍,不知道实际的开发中是不是这样用线程去等待接受别人发送信息

0 回复 有任何疑惑可以回复我~

package test;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ServerSocket {
 public static void main(String[] args) throws UnknownHostException, IOException{
  java.net.ServerSocket server=new java.net.ServerSocket(10);
  List list=new ArrayList();
  while(true){
   Socket socket= server.accept();
   list.add(new Session(socket));
   /*OutputStream output= socket.getOutputStream();
   ObjectOutputStream objout=new ObjectOutputStream(output);
   objout.writeObject(list);*/
  }
 }
}


class Session extends Thread{
 private Socket sck;
 private User u;
 public Session(Socket sck) throws IOException{
  this.sck=sck;
  Scanner sc=new Scanner(System.in);
  try {
   InputStream input= sck.getInputStream();
   ObjectInputStream objInput=new ObjectInputStream(input);
   this.u=(User)objInput.readObject();
   System.out.println("当前用户:"+u.getName());
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  this.start();
  OutputStream output=this.sck.getOutputStream();
  while(true){
   System.out.print("您说:");
   String mesg= sc.nextLine();
   output.write(("\n"+mesg).getBytes());
  }
 }
 
 @Override
 public void run() {
  while(true){
   InputStream input=null;
   int length=0;
   try {
    input = sck.getInputStream();
    length= input.available();
    byte[] b=new byte[length];
    input.read(b);
    String str=new String(b);
    if(str!=null&&!str.isEmpty()){
     System.out.println("\n"+u.getName()+"说:"+str);
    }
    this.sleep(100);
   } catch (IOException e) {
    try {
     input.close();
    } catch (IOException e1) {
     e1.printStackTrace();
    }
    e.printStackTrace();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
}

这是服务器端代码

0 回复 有任何疑惑可以回复我~

package test;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.List;
import java.util.Scanner;

public class ClinetSocket extends Thread {
 private Socket socket;
 public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException{
  new ClinetSocket().login();
 }
 
 public void login() throws UnknownHostException, IOException, ClassNotFoundException{
  Scanner sc=new Scanner(System.in);
  System.out.print("请输入您的昵称:");
  User u= new User(sc.nextLine());
  Socket socket=new Socket("127.0.0.1", 10);
  OutputStream output= socket.getOutputStream();
  ObjectOutputStream objout=new ObjectOutputStream(output);
  objout.writeObject(u);
  this.socket=socket;
  this.start();
  /*while(true){
   InputStream input= socket.getInputStream();
   ObjectInputStream objInput=new ObjectInputStream(input);
   List list= (List)objInput.readObject();
   if(list!==null&&!list.isEmpty()){
    System.out.println("当前在线用户:");
    for(int i=0;i<list.size();i++){
     
    }
   }
  }*/
  while(true){
   System.out.print("您说:");
   String mesg= sc.nextLine();
   output.write(mesg.getBytes());
  }
 }
 
 public void run(){
  InputStream input=null;
  try {
   input= this.socket.getInputStream();
   while(true){
    byte[] b=new byte[input.available()];
    input.read(b);
    if(b.length>0){
     System.out.println("\n"+new String(b));
    }
   }
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

class User implements Serializable{
 private String name;
 public User(String name){
  this.name=name;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}

这是客户端代码

0 回复 有任何疑惑可以回复我~

我在客户端使用一个线程去无限循环执行这样的一段代码获取服务器端发送的消息

public void run(){
  InputStream input=null;
  try {
   input= this.socket.getInputStream();
   while(true){
    byte[] b=new byte[input.available()];
    input.read(b);
    if(b.length>0){
     System.out.println("\n"+new String(b));
    }
   }
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

不知道这么做是不是不合适

0 回复 有任何疑惑可以回复我~
info = br.readLine()

客户端线程是在这行代码停下的,不知道具体是为啥,具体是哪个方法实现的阻塞?求。。。



0 回复 有任何疑惑可以回复我~
#1

蓝胖子Torres

点进去看看源码不就知道了吗
2015-01-29 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

请教老师一个问题?服务器端有accpet()函数等待客户端响应,但客户端没有accpet()函数来监听,服务器端又没有进行消息推送,客户端获得消息是啥时触发的

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信