Java網路程式設計的socket使用(簡單的伺服器客戶端實現)
阿新 • • 發佈:2019-02-07
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class Server extends Thread { //建立一個ServerSocket,用於監聽客戶端Socket連線請求 ServerSocket server = null; Socket socket = null; public Server(int port) { try { server = new ServerSocket(port); } catch (IOException e) { e.printStackTrace(); } } public void run() { super.run(); try { System.out.println("wait client connect..."); //偵聽並接受到此套接字的連線。此方法在連線傳入之前一直阻塞 socket = server.accept(); new sendMessThread().start(); System.out.println(socket.getInetAddress().getHostAddress()+"SUCCESS TO CONNECT..."); InputStream in = socket.getInputStream(); int len = 0; byte[] buf = new byte[1024]; while ((len = in.read(buf)) != -1) { System.out.println("client saying: " + new String(buf, 0, len)); } } catch (IOException e) { e.printStackTrace(); } } class sendMessThread extends Thread { public void run() { super.run(); Scanner scanner = null; OutputStream out = null; try { if (socket != null) { scanner = new Scanner(System.in); out = socket.getOutputStream(); String in = ""; do { in = scanner.next(); out.write(("server saying: " + in).getBytes()); out.flush(); }while (!in.equals("q")); } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { Server server = new Server(1234); server.start(); } }
package Test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class Client extends Thread { //定義一個Socket物件 Socket socket = null; public Client(String host, int port) { try { //需要伺服器的IP地址和埠號,才能獲得正確的Socket物件 socket = new Socket(host, port); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void run() { //客戶端一連線就可以寫資料個伺服器了 new sendMessThread().start(); super.run(); try { // 讀Sock裡面的資料 InputStream s = socket.getInputStream(); byte[] buf = new byte[1024]; int len = 0; while ((len = s.read(buf)) != -1) { System.out.println(new String(buf, 0, len)); } } catch (IOException e) { e.printStackTrace(); } } //往Socket裡面寫資料,需要新開一個執行緒 class sendMessThread extends Thread{ public void run() { super.run(); //寫操作 Scanner scanner = null; OutputStream os = null; try { scanner = new Scanner(System.in); os = socket.getOutputStream(); String in = ""; do { in = scanner.next(); os.write(("" + in).getBytes()); os.flush(); } while (!in.equals("bye")); } catch (IOException e) { e.printStackTrace(); } scanner.close(); try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { //需要伺服器的正確的IP地址和埠號 Client clientTest = new Client("127.0.0.1", 1234); clientTest.start(); } }
簡化版服務端 import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(9050); System.out.println("waiting..."); //等待client的請求 Socket socket = server.accept(); while (true) { // 接收客戶端的資料 DataInputStream in = new DataInputStream(socket.getInputStream()); String string = in.readUTF(); System.out.println("client:" + string); // 傳送給客戶端資料 DataOutputStream out = new DataOutputStream(socket.getOutputStream()); out.writeUTF("hi,i am hserver!i say:" + string); } } } 客戶端 import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class Client { public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("localhost", 9050); while (true) { try { System.out.println("please input..."); Scanner scanner = new Scanner(System.in); String p = scanner.nextLine(); // 傳送給伺服器的資料 DataOutputStream out = new DataOutputStream(socket.getOutputStream()); out.writeUTF(p); // 接收伺服器的返回資料 DataInputStream in = new DataInputStream(socket.getInputStream()); System.out.println("server:" + in.readUTF()); } catch (Exception e) { socket.close(); e.printStackTrace(); } } } }