首頁 > 軟體

java socket實現區域網聊天

2022-05-19 19:02:06

使用socket實現區域網聊天,寫這個主要是為了深入理解socket與資訊流在網路中的傳送過程加深理解。

程式碼很簡單分為兩個類,一個伺服器類,一個使用者端,執行時分別啟動兩個執行緒一個負責接受另一個負責傳送。

整體流程是 兩臺機器分別啟動程式,一個選擇主動連線 另一個選擇被動接受,即可實現類似qq的聊天效果兩個人可以同時傳送訊息。

注意的事,不要在同一臺電腦上同時啟動兩個,這樣會伺服器端和使用者端的ip都是相同很有可能造成自己傳送的訊息自己接受到了,可以兩臺電腦或者虛擬機器器裡面進行。

伺服器端:

package com.server;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
 
import com.client.RunClient;
 
public class RunServer {
    public static Socket socket=null;
    /**
     * 建立伺服器被動連線
     * @throws IOException
     */
    public void startServer() throws IOException {
        //伺服器接收資料
        ServerSocket serverSocekt=new ServerSocket(8888);
        System.out.println("伺服器啟動,等待連線...");
        //建立使用者端執行緒
        RunClient rc=new RunClient();
        Thread rct=new Thread(rc);
        rct.start();
        
        
        //阻塞執行緒 監聽埠建立socket對談
        RunServer.socket=serverSocekt.accept();
        
        
        //獲取輸入留
        InputStream is=socket.getInputStream();
        //將位元組輸入流轉換成字元輸入流
        InputStreamReader isr=new InputStreamReader(is);
        //將字元輸入流裝入帶緩衝的輸入流中
        BufferedReader br=new BufferedReader(isr);
        
        String str=null;
        while((str=br.readLine())!=null){
            System.out.print("輸出資訊:"+str);
        }
        socket.shutdownInput();
        serverSocekt.close();
    }
}

使用者端:

package com.client;
 
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
 
import com.server.RunServer;
 
public class RunClient implements Runnable {
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        System.out.println("1、主動連線n2、被動等待");
        String sign=input.next();
        switch (sign) {
        case "1":
            try {
                System.out.println("輸入伺服器IP:");
                startClient(input.next());
            } catch (Exception e) {
                e.printStackTrace();
            }
            break;
        case "2":
            try {
                startClient();
            } catch (Exception e) {
                e.printStackTrace();
            }
            break;
            
        default:
            break;
        }
    }
    
    
    /**
     * 由已經建立的socket 進行連線反向連
     * @throws Exception 
     * @throws UnknownHostException 
     */
    public void startClient() throws Exception{
        
        while(true){
            try {
                if(RunServer.socket!=null){
                    break;
                }
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        
        // 與伺服器建立連線
        Socket socket=new Socket(RunServer.socket.getInetAddress().getHostAddress(), 8888);
        System.out.println("連線建立成功...");
        
        //向伺服器寫入流
        OutputStream os=socket.getOutputStream();
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
        Scanner input=new Scanner(System.in);
        
        while(true){
            System.out.println("輸入資訊:");
            bw.write(input.next());
            bw.newLine();
            bw.flush();
        }
    }
    
    /**
     * 通過IP與伺服器建立連線
     * @throws Exception 
     * @throws UnknownHostException 
     */
    public void startClient(String ip) throws Exception{
        // 與伺服器建立連線
        Socket socket=new Socket(ip, 8888);
        System.out.println("連線建立成功...");
        
        //向伺服器寫入流
        OutputStream os=socket.getOutputStream();
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
        Scanner input=new Scanner(System.in);
        
        while(true){
            bw.write(input.next());
            bw.newLine();
            bw.flush();
        }
    }
}

main:

package com.start;
 
import com.server.RunServer;
 
public class Go {
 
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        RunServer rs=new RunServer();
        rs.startServer();
    }
 
}

效果:我是用虛擬機器器加本機

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com