請教老師一個問題?服務器端有accpet()函數等待客戶端響應,但客戶端沒有accpet()函數來監聽,服務器端又沒有進行消息推送,客戶端獲得消息是啥時觸發的
我調試了一下,客戶端的socket.shutdownOutput()會觸發serverSocket.accept();可是服務器線程是如何保證在向客戶端寫入“歡迎你”后客戶端才會進行數據流的讀入。求解。。。。
我調試了一下,客戶端的socket.shutdownOutput()會觸發serverSocket.accept();可是服務器線程是如何保證在向客戶端寫入“歡迎你”后客戶端才會進行數據流的讀入。求解。。。。
2015-01-26
舉報
2015-01-26
accept()方法是服務器端方法,是用來監聽某個端口是否收到連接請求,這都沒建立連接呢,發送啥數據。
至于說客戶端獲得服務器的響應,那是連接建立之后,getInputStream()方法可以獲取輸入流,這個方法是阻塞的,就是調用之后會一直等待數據到來。
客戶端和服務器的socket你都沒搞清楚吧!
客戶端socket.shutdownOutput()之后,服務器知道這個客戶端不會再發送數據了,如果服務器的數據也已經發送完畢,連接就會斷開,服務器重新調用accept()方法,繼續監聽端口。
2015-01-28
樓上正解
2015-02-02
以前再學校里面學過一點點socket,現在聽過老師講的課后又編寫了一遍,不知道實際的開發中是不是這樣用線程去等待接受別人發送信息
2015-02-02
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();
???}
??}
?}
}
這是服務器端代碼
2015-02-02
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;
?}
}
這是客戶端代碼
2015-02-02
我在客戶端使用一個線程去無限循環執行這樣的一段代碼獲取服務器端發送的消息
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();
??}
?}
不知道這么做是不是不合適
2015-01-27
客戶端線程是在這行代碼停下的,不知道具體是為啥,具體是哪個方法實現的阻塞?求。。。