Java網路通訊套接字

小弟季義欽發表於2012-11-01

(一)第一個例子是簡單的Socket通訊,一個客戶端和一個伺服器執行緒:

/**
 * SimpleClient.java
 */
package network;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class SimpleClient {

	public static void main(String[] args) {
		Socket socket = null;
		BufferedReader reader = null;
		PrintWriter writer = null;
		try {			
			//請求建立通訊套接字
			socket  = new Socket("localhost",8089);
			
			//獲取輸入輸出流
			reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			writer = new PrintWriter(socket.getOutputStream(), true);	//true means autoFlush 
			
			//while(true){
				writer.println("hello, I am Client\n");
				String mess = reader.readLine();
				System.out.print("Client Receive:"+mess);
			//}
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if(socket != null) socket.close();
				if(reader != null) reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			if(writer != null) writer.close();
		}
	}
}
/**
 * SimpleServer.java
 */
package network;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class SimpleServer {

	public static void main(String[] args) {
		ServerSocket ss = null;	//用於接收請求的Socket
		Socket socket = null;	//用於通訊的Socket
		BufferedReader reader = null;
		PrintWriter writer = null;
		
		try {
			
			ss = new ServerSocket(8089);
			System.out.print("waiting for new request...\n");
			socket = ss.accept();	//等待請求,建立通訊Socket
			
			reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			writer = new PrintWriter(socket.getOutputStream(), true);
			
			String mess = reader.readLine();
			System.out.print("Server Receive:"+mess);
			writer.println("Yes, I can hear you");
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


(二)第二個列子是在伺服器端,採用多執行緒方式處理來自客戶端的請求:

/**
 * TCPClient.java
 */
package network;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClient {
	private static int id = 0;
	
	public static void main(String[] args) {
		
		String host = "localhost";
		int port = 8060;
		Socket socket = null;
		BufferedReader in = null;
		PrintWriter out = null;
		
		try {
			
			//建立五個請求伺服器連線的客戶端
			for(int i=0;i<5;i++){
				
				//建立通訊套接字
				socket = new Socket(host, port);
				
				//獲取套接字的輸入輸出流
				in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				out = new PrintWriter(socket.getOutputStream(), true);
				
				//向伺服器傳送訊息
				out.println("hello, i am client "+(++id));
			}
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			
			System.out.print("Closing Socket...\n");
			try {
				if(socket != null) socket.close();
				if(in != null) in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			if(out != null) out.close();
		}
	}
}
/**
 * TCPServer.java
 */
package network;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
	public static void main(String[] args) {

		int port = 8060;
		Socket socket = null;
		ServerSocket server = null;
		
		try {			
			//建立伺服器套接字
			server = new ServerSocket(port);
			
			while(true){
				
				//接收來自客戶端的請求,建立通訊套接字
				System.out.print("waiting for new request...\n");
				socket = server.accept();
				
				//建立一個執行緒處理該請求
				Thread t = new Thread(new ServerThread(socket));
				t.start();
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			
			try {
				if(server != null) server.close();
				if(socket != null) socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}			
		}
	}
}

/**
 * 處理來自客戶端請求的執行緒
 * */
class ServerThread implements Runnable{
	private Socket socket;
	
	public ServerThread(Socket s){
		this.socket = s;
	}
	
	public void run() {
		BufferedReader in = null;
		PrintWriter out = null;
		
		try {
			//獲取套接字的輸入輸出流
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new PrintWriter(socket.getOutputStream(), true);
			
			//讀取客戶端傳送來的訊息
			String s = in.readLine();
			System.out.println("recv:"+s);
			//out.write("accept");
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			
			System.out.print("Closing Connection...\n");
			try {
				if(socket != null) socket.close();
				if(in != null) in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			if(out != null) out.close();
		}		
	}	
}


相關文章