Java網路程式設計(一)

鴨脖發表於2012-09-09

今天主要用java寫了一個傳送訊息和傳送檔案的一個程式。其實實際上還是和java的io打交道。大家要明白的是,socket也是一種檔案描述符。學過unix的童鞋應該都知道,網路程式設計從管道,雙向管道,通道,到socket通訊,其實還是通過檔案描述符來玩位元組和字元。所以大家要把java io方面的東西弄清楚。


貼程式:


伺服器端:

import java.io.*;
import java.net.*;


class Server{
public static void main(String[] args){
try{
ServerSocket server = new ServerSocket(8088);
Socket client = server.accept();


DataInputStream datastream = new DataInputStream(client.getInputStream());
System.out.println(datastream.readUTF());
DataOutputStream datastream2 = new DataOutputStream(client.getOutputStream());
datastream2.writeUTF("cao");
// datastream2.flush();
datastream2.writeUTF("ni");
// datastream2.flush();
datastream2.writeUTF("ma");

File file = new File("C:\\Users\\Yelbosh\\Desktop\\box2d.pdf");
byte[] tem = new byte[1024];
int progress = 0;
long  size = file.length();
datastream2.writeLong(size);
FileInputStream input = new FileInputStream(file);


while(progress < size){
int curr = input.read(tem);
datastream2.write(tem);
progress += curr;
System.out.println(progress);
}




server.close();
client.close();
}catch(Exception e){
System.out.println(e);
}
}
}


客戶端:

import java.io.*;
import java.net.*;


class Client{
public static void main(String[] args){
try{
Socket socket = new Socket("localhost",8088);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());   
 
DataInputStream dis = new DataInputStream(socket.getInputStream());   

dos.writeUTF("I'm clients!!");   

System.out.println(dis.readUTF()); 
System.out.println(dis.readUTF());
System.out.println(dis.readUTF());  


File file = new File("C:\\Users\\Yelbosh\\Desktop\\box2d22222.pdf");
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);


long size = dis.readLong();
int progress = 0;
byte[] tem = new byte[1024];
int x;


while((x = dis.read(tem)) != -1){
ostream.write(tem);
progress += x;
System.out.println(progress);
}

socket.close();   
}catch(Exception e){
System.out.println(e);
}
}
}


注意serversocket的receive方法。javadoc上說是這麼:

偵聽並接受到此套接字的連線。此方法在進行連線之前一直阻塞。

所以其內部實現其實是通過while迴圈來實現的。所以如果沒有客戶端連線的話那麼伺服器端會一直處於阻塞狀態而不會退出。

但是有一個地方我不太明白的是,如果客戶端分幾次在socket的outputstream中進行寫入的時候,為什麼不能從伺服器端一次性的讀出。我不知道這個內部的實現原理是什麼,歸根結底是因為io方面學得不夠紮實。弄清楚之後會告訴大家的。















相關文章