和socket程式設計有關的幾個類:
InetAddress
Socket:用在用戶端
ServerSocket:用在伺服器端
一。點對點通信
伺服器端:
package server; import java.io.*; import java.net.*; public class Server { private int port; public Server(int port){ this.port=port; start(); } //将從用戶端收到的資訊轉化為大寫的 public String process(String line){ return line.toUpperCase(); } public void start(){ try{ //根據端口建立套接字 ServerSocket myscoket=new ServerSocket(port); //顯示連接配接資訊 System.out.println("伺服器啟動完成,監聽端口在"+port); System.out.println("正在等待客戶連接配接........."); //挂起等待客戶的請求 Socket connection=myscoket.accept(); //測試 System.out.println("客戶發來連接配接請求........."); //擷取讀取用戶端的資料流 BufferedReader in=new BufferedReader(new InputStreamReader(connection.getInputStream())); //擷取寫往用戶端的資料輸出流,true表示自動重新整理 PrintWriter out=new PrintWriter(connection.getOutputStream(),true); //向客戶發送歡迎的資訊 out.println("您好,伺服器連接配接成功!"); out.println("輸入bye斷開與伺服器的連接配接"); boolean done=false; while(!done){ //讀取用戶端的内容 String line=in.readLine(); if(line==null){ done=true; }else{ //從伺服器端顯示用戶端發送的資訊 System.out.println("從用戶端來的内容"+line); //資訊處理 String message=process(line); //向用戶端發送資訊 out.println("從伺服器端口發送的資訊"+message); if(line.trim().equals("BYE")) done=true; } } //關閉通信 connection.close(); }catch(Exception e){ System.out.println(e); } } } package server; public class ServerDemo { public static void main(String[] args) { // TODO Auto-generated method stub if(args.length!=1){ System.out.println("運作方式:java Server "); return; } try{ //獲得端口号 int port=Integer.parseInt(args[0]); Server myserver=new Server(port); }catch(Exception e){ System.out.println(e); } } }
用戶端:
package client; import java.io.*; import java.net.*; public class Client { private String host; private int port; public Client(String host,int port){ this.host=host; this.port=port; connect(); } public void connect(){ try{ Socket connection; if(host.equals("localhost")) {connection=new Socket(InetAddress.getLocalHost(),port);} else { connection=new Socket(InetAddress.getByName(host),port);} //獲得從鍵盤輸入流 BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in)); //獲得伺服器寫内容的資料流 PrintWriter out=new PrintWriter(connection.getOutputStream(),true); //獲得接收伺服器發送内容的輸入流 BufferedReader in=new BufferedReader(new InputStreamReader(connection.getInputStream())); //從伺服器獲得歡迎資訊 System.out.println("伺服器資訊:"+in.readLine()); System.out.println("伺服器資訊:"+in.readLine()); //提示使用者輸入 System.out.print("請輸入>"); boolean done=false; while(!done){ //從鍵盤上讀取字元 String line=stdin.readLine(); //發送到服務端 out.println(line); //如果讀到bye則結束循環 if(line.equalsIgnoreCase("bye")) done=true; //從伺服器讀取字元串 String info=in.readLine(); //顯示從伺服器發送來的資料 System.out.println("伺服器資訊:"+info); //提示使用者輸入 if(!done) System.out.print("請輸入>"); } //關閉 connection.close(); }catch(SecurityException e){ System.out.println("連接配接伺服器出現安全問題!"); }catch(IOException e){ System.out.println("連接配接伺服器出現I/O錯誤!"); } } } package client; public class ClientDemo { public static void main(String[] args) { // TODO Auto-generated method stub if(args.length!=2){ System.out.println("程式運作方式:java client "); return; } String host=args[0]; try{ int port=Integer.parseInt(args[1]); Client myserver=new Client(host,port); }catch(Exception e){ System.out.println(e); } } }
二。點對面通信
服務端:
package server; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server extends ServerSocket { private int port; //private Socket connection; public Server(int port)throws IOException{ super(port); this.port=port; System.out.println("伺服器啟動完成,監聽端口在"+port); System.out.println("正在等待客戶連接配接....."); try{ while(true){ //挂起,直到客戶請求 Socket connection=accept(); //建立服務線程 new ServerThread(connection,port); } }catch(IOException e){ System.out.println(e); }finally{ close(); } } } package server; import java.io.*; import java.net.*; public class ServerThread extends Thread{ private int port; private Socket connection; private BufferedReader in; private PrintWriter out; public ServerThread(Socket s,int port)throws IOException{ this.port=port; this.connection=s; //擷取讀取用戶端的資料流 in=new BufferedReader(new InputStreamReader(connection.getInputStream (),"gb2312")); //擷取寫往用戶端的資料輸出流,true表示自動重新整理 out=new PrintWriter(connection.getOutputStream(),true); //向客戶發送歡迎的資訊 out.println("您好,伺服器連接配接成功!"); out.println("輸入bye斷開與伺服器的連接配接"); //啟動線程 start(); } //将從用戶端收到的資訊轉化為大寫的 public String process(String line){ return line.toUpperCase(); } public void run(){ try{ boolean done=false; while(!done){ String line=in.readLine(); if(line==null) done=true; else{ if(line.trim().equals("bye")) done=true; System.out.println("從用戶端來的内容"+line); String message=process(line); out.println("從伺服器端口發出的内容"+message); } } System.out.println("bye bye!"); //關閉通信 connection.close(); }catch(Exception e){ System.out.println(e); } } } package server; public class ServerDemo { public static void main(String[] args) { // TODO Auto-generated method stub if(args.length!=1){ System.out.println("運作方式:java Server "); return; } try{ //獲得端口号 int port=Integer.parseInt(args[0]); Server myserver=new Server(port); }catch(Exception e){ System.out.println(e); } } }
用戶端:
package client; import java.io.*; import java.net.*; public class Client { private String host; private int port; public Client(String host,int port){ this.host=host; this.port=port; connect(); } public void connect(){ try{ Socket connection; if(host.equals("localhost")) connection=new Socket(InetAddress.getLocalHost(),port); else connection=new Socket(InetAddress.getByName(host),port); //獲得從鍵盤輸入流 BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in)); //獲得伺服器寫内容的資料流 PrintWriter out=new PrintWriter(connection.getOutputStream(),true); //獲得接收伺服器發送内容的輸入流 BufferedReader in=new BufferedReader(new InputStreamReader(connection.getInputStream())); //從伺服器獲得歡迎資訊 System.out.println("伺服器資訊:"+in.readLine()); System.out.println("伺服器資訊:"+in.readLine()); //提示使用者輸入 System.out.print("請輸入>"); boolean done=false; while(!done){ //從鍵盤上讀取字元 String line=stdin.readLine(); //發送到服務端 out.println(line); //如果讀到bye則結束循環 if(line.equalsIgnoreCase("bye")) done=true; //從伺服器讀取字元串 String info=in.readLine(); //顯示從伺服器發送來的資料 System.out.println("伺服器資訊:"+info); //提示使用者輸入 if(!done) System.out.print("請輸入>"); } //關閉 connection.close(); }catch(SecurityException e){ System.out.println("連接配接伺服器出現安全問題!"); }catch(IOException e){ System.out.println("連接配接伺服器出現I/O錯誤!"); } } } package client; public class ClientDemo { public static void main(String[] args) { // TODO Auto-generated method stub if(args.length!=2){ System.out.println("程式運作方式:java client "); return; } String host=args[0]; try{ int port=Integer.parseInt(args[1]); Client myserver=new Client(host,port); }catch(Exception e){ System.out.println(e); } } }