主要以 Socket 實現一個Server 端來接收 Client 的連線 往後在介紹更多的 Client/Server 的通訊方法
首先先說明常用於網路串流的 DataInputStream 和 DataOutputStream
不過你也是可以利用其他的串流類別,如: PrintWriter
通常再某一端(Client) 如要讀取Server的資料或是傳送資料給Server 時
都需要取得串流在能夠讀取或是寫入,而都是以
java.net.Socket 的 getInputStream() 和 getOutputStream() 這兩個方法來取得串流
並加載於 DataInputStream 或是 DataOutputStream 上,例如以下所示
DataInputStream datain = new DataInputStream(socket.getInputStream());
以下是 DataOutputStream 常用的寫入串流方法,如下
void | writeBoolean(boolean v)writeByte(int v)writeChar(int v)writeDouble(double v)writeInt(int v)writeUTF(String str) //常用 |
以下是 DataInputStream 長用的讀取串流方法,如下
byte | readByte()readBoolean()readChar()readDouble()readLine()readUTF() |
以下來看一下 Client 的程式
import java.io.*;
import java.net.*;
public class echoClient{
public echoClient(int port)
{
try{
Socket client = new Socket("xxx.xxx.x.xxx", port); //這裡填入Server端的IP位置
System.out.println("---- connect to xxx.xxx.x.xxx ----");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); //鍵盤輸入
DataOutputStream out = new DataOutputStream(client.getOutputStream());
DataInputStream datain = new DataInputStream(client.getInputStream());
String input = in.readLine(); //由鍵盤讀取一段資料
out.writeUTF(input); //並將資料寫入到串流(即傳送給 Server)
System.out.println(datain.readUTF()); //由 Server 端讀取Server傳過來的資料
client.close();
}catch(Exception e){
System.out.println(e.getMessage());
System.exit(-1);
}
}
public static void main(String[] args)
{
int port = 0;
if(args.length < 1) //需輸入 Server 端的埠號
{
System.out.println("Usage: java echoClient [port]");
System.exit(1);
}else{
port = Integer.parseInt(args[0]);
echoClient client = new echoClient(port);
}
}
}
以下為 Server 端的程式 import java.io.*;
import java.net.*;
public class echoServer
{
public echoServer(int port)
{
try{
ServerSocket server = new ServerSocket(port);
System.out.println("start to waiting...");
Socket clientSocket = server.accept(); //接收一個 client 連線
java.util.Date currentDate = new java.util.Date();
/*** 印出 client 的資料 ***/
System.out.println("----- Accept a client -----");
System.out.println("Clinet IP: " + clientSocket.getInetAddress().getHostAddress());//Client IP
System.out.println("Client Port: " + clientSocket.getPort()); //Client 埠號
System.out.println("connect date: " + currentDate); //目前時間
this.process(clientSocket);
clientSocket.close();
}catch(IOException e){
System.out.println("Could not listen on port:" + port);
System.exit(-1);
}
}
public void process(Socket client)
{
try{
DataOutputStream out = new DataOutputStream(client.getOutputStream());
DataInputStream in = new DataInputStream(client.getInputStream());
String userInput = in.readUTF(); //讀取 Client 傳送過來的資料
System.out.println("receive from client : " + userInput);
out.writeUTF("Server has a echo : " + userInput); //將該資料產生 echo 並回傳
}catch(IOException e){
System.out.println("Client out");
}
}
public static void main(String[] args)
{
int port;
if(args.length < 1)
{
System.out.println("Usage: java Server_7 [port]"); //建立一個 Server 須要一個埠號
System.exit(1);
}
try{
port = Integer.parseInt(args[0]);
echoServer s = new echoServer(port);
}
catch(NumberFormatException e){
System.out.println("Port is Integer!!");
}
}
}
以上程式應該可以發現 一次只能一個連線
要讓一個 Server 接收多個請求並互相溝通
需要將
Socket clientSocket = server.accept(); 至於回圈內
再加上執行緒的控制方可達成,這個之後再介紹吧
沒有留言:
張貼留言