1. 程式人生 > >Java網路程式設計的socket使用(簡單的伺服器客戶端實現)

Java網路程式設計的socket使用(簡單的伺服器客戶端實現)

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();
            }
        }
    }
}