天天看點

java多線程實作伺服器端與多個不同端口用戶端通信

server端:

import java.io.DataInputStream; 
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;



// 伺服器類  
public class MyServer {
    private int port = 8083;// 預設伺服器端口1  
    private int port2 = 8084;// 預設伺服器端口2
    public MyServer() {

    }  

   
    public MyServer(int port) {
        this.port = port;
    }  

    // service方法  
    public void service() {
        try {// 建立伺服器連接配接  
            ServerSocket server = new ServerSocket(port);//建立  ServerSocket類 ,port端口            
            Socket socket = server.accept();// 等待客戶連接配接  
            try {                  
                DataInputStream in = new DataInputStream(socket  
                        .getInputStream());// 讀取用戶端傳過來資訊的DataInputStream                   
                DataOutputStream out = new DataOutputStream(socket  
                        .getOutputStream());// 向用戶端發送資訊的DataOutputStream                                
                while (true) {                       
                    String accpet = in.readUTF();// 讀取來自用戶端的資訊   
                    System.out.println(accpet);//輸出來自用戶端的資訊                            
                    out.writeUTF("伺服器發送給client1");//伺服器傳回給client1資料
                }  
            } finally {
                socket.close();//關閉連接配接 
                server.close();//關閉                
            }  
        } catch (IOException e) {
            e.printStackTrace();  
        }  
    }  

    
    public void service2() {
    	try {
            ServerSocket server = new ServerSocket(port2);//建立  ServerSocket類 ,port2端口            
            Socket socket = server.accept();// 等待客戶連接配接  
            try {                  
                DataInputStream in = new DataInputStream(socket  
                        .getInputStream());// 讀取用戶端傳過來資訊的DataInputStream                   
                DataOutputStream out = new DataOutputStream(socket  
                        .getOutputStream());// 向用戶端發送資訊的DataOutputStream                     
               
                while (true) {                       
                    String accpet = in.readUTF();// 讀取來自用戶端的資訊   
                    System.out.println(accpet);//輸出來自用戶端的資訊                                
                    out.writeUTF("伺服器傳回給client2");//伺服器傳回給client2資料
                }  
            } finally {
                socket.close();//關閉連接配接 
                server.close();//關閉                
            }  
        } catch (IOException e) {//捕獲異常
            e.printStackTrace();  
        }  
	}
    public static void main(String[] args) {  
       MyServer server = new MyServer();
       new Thread(server::service,"s1").start();
       new Thread(server::service2,"s2").start();
    }  
}  
           

Client類:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;


public class MyClient2 {
    private String host = "localhost";// 預設連接配接到本機
    private int port = 8084;

    public MyClient2() {

    }

    // 連接配接到指定的主機和端口
    public MyClient2(String host, int port) {
        this.host = host;
        this.port = port;
    }

    public void Send() {
        try {            
            Socket socket = new Socket(host, port);//建立Socket類對象
            try {

                DataInputStream in = new DataInputStream(socket
                        .getInputStream());// 讀取伺服器端傳過來資訊的DataInputStream

                DataOutputStream out = new DataOutputStream(socket
                        .getOutputStream());// 向伺服器端發送資訊的DataOutputStream

                Scanner scanner = new Scanner(System.in);

                while (true) {
                    String send = scanner.nextLine();//讀取控制台輸入的内容
                    System.out.println("用戶端2:" + send);//輸出鍵盤輸出内容提示 ,也就是用戶端向伺服器端發送的消息
                    // 把從控制台得到的資訊傳送給Myserver
                    out.writeUTF("用戶端2:" + send);//将用戶端的資訊傳遞給伺服器             
                    String accpet = in.readUTF();// 讀取來自伺服器的資訊
                    System.out.println(accpet);//輸出來自伺服器傳回的資訊
                }

            } finally {
                socket.close();//關閉Socket監聽
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {//主程式方法
        new MyClient2().Send();
    }
}
           

另一個Client隻需修改port即可。

運作結果:

java多線程實作伺服器端與多個不同端口用戶端通信