亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

請教老師一個問題?服務器端有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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號