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