java?socket實(shí)現(xiàn)局域網(wǎng)聊天
使用socket實(shí)現(xiàn)局域網(wǎng)聊天,寫這個主要是為了深入理解socket與信息流在網(wǎng)絡(luò)中的傳送過程加深理解。
代碼很簡單分為兩個類,一個服務(wù)器類,一個客戶端,運(yùn)行時分別啟動兩個線程一個負(fù)責(zé)接受另一個負(fù)責(zé)發(fā)送。
整體流程是 兩臺機(jī)器分別啟動程序,一個選擇主動連接 另一個選擇被動接受,即可實(shí)現(xiàn)類似qq的聊天效果兩個人可以同時發(fā)送消息。
注意的事,不要在同一臺電腦上同時啟動兩個,這樣會服務(wù)端和客戶端的ip都是相同很有可能造成自己發(fā)送的消息自己接受到了,可以兩臺電腦或者虛擬機(jī)里面進(jìn)行。
服務(wù)端:
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; ?? ?/** ?? ? * 建立服務(wù)器被動連接 ?? ? * @throws IOException ?? ? */ ?? ?public void startServer() throws IOException { ?? ??? ?//服務(wù)器接收數(shù)據(jù) ?? ??? ?ServerSocket serverSocekt=new ServerSocket(8888); ?? ??? ?System.out.println("服務(wù)器啟動,等待連接..."); ?? ??? ?//創(chuàng)建客戶端線程 ?? ??? ?RunClient rc=new RunClient(); ?? ??? ?Thread rct=new Thread(rc); ?? ??? ?rct.start(); ?? ??? ? ?? ??? ? ?? ??? ?//阻塞線程 監(jiān)聽端口建立socket會話 ?? ??? ?RunServer.socket=serverSocekt.accept(); ?? ??? ? ?? ??? ? ?? ??? ?//獲取輸入留 ?? ??? ?InputStream is=socket.getInputStream(); ?? ??? ?//將字節(jié)輸入流轉(zhuǎn)換成字符輸入流 ?? ??? ?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("輸入服務(wù)器IP:"); ?? ??? ??? ??? ?startClient(input.next()); ?? ??? ??? ?} catch (Exception e) { ?? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?case "2": ?? ??? ??? ?try { ?? ??? ??? ??? ?startClient(); ?? ??? ??? ?} catch (Exception e) { ?? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ??? ? ?? ??? ?default: ?? ??? ??? ?break; ?? ??? ?} ?? ?} ?? ? ?? ? ?? ?/** ?? ? * 由已經(jīng)建立的socket 進(jìn)行連接反向連 ?? ? * @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(); ?? ??? ??? ?} ?? ??? ?} ?? ??? ? ?? ??? ? ?? ??? ?// 與服務(wù)器建立連接 ?? ??? ?Socket socket=new Socket(RunServer.socket.getInetAddress().getHostAddress(), 8888); ?? ??? ?System.out.println("連接建立成功..."); ?? ??? ? ?? ??? ?//向服務(wù)器寫入流 ?? ??? ?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與服務(wù)器建立連接 ?? ? * @throws Exception? ?? ? * @throws UnknownHostException? ?? ? */ ?? ?public void startClient(String ip) throws Exception{ ?? ??? ?// 與服務(wù)器建立連接 ?? ??? ?Socket socket=new Socket(ip, 8888); ?? ??? ?System.out.println("連接建立成功..."); ?? ??? ? ?? ??? ?//向服務(wù)器寫入流 ?? ??? ?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(); ?? ?} ? }
效果:我是用虛擬機(jī)加本機(jī)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java實(shí)現(xiàn)局域網(wǎng)聊天室功能(私聊、群聊)
- Java實(shí)現(xiàn)局域網(wǎng)聊天小程序
- Java用局域網(wǎng)實(shí)現(xiàn)聊天室功能
- Java創(chuàng)建多線程局域網(wǎng)聊天室實(shí)例
- Java實(shí)現(xiàn)簡單局域網(wǎng)聊天室
- Java多線程局域網(wǎng)聊天室的實(shí)現(xiàn)
- java局域網(wǎng)聊天小程序
- java實(shí)現(xiàn)簡易局域網(wǎng)聊天功能
- 基于java編寫局域網(wǎng)多人聊天室
- java+socket實(shí)現(xiàn)簡易局域網(wǎng)聊天室
相關(guān)文章
解決spring-cloud-config 多服務(wù)共享公共配置的問題
這篇文章主要介紹了解決spring-cloud-config 多服務(wù)共享公共配置的問題,本文通過多種方法給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11詳解Maven settings.xml配置(指定本地倉庫、阿里云鏡像設(shè)置)
這篇文章主要介紹了詳解Maven settings.xml配置(指定本地倉庫、阿里云鏡像設(shè)置),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Java?多個文件生成zip包、下載zip包的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java?多個文件生成zip包、下載zip包,包括文件上傳,文件下載,多個文件打成zip包的操作代碼,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01基于java開發(fā)之系統(tǒng)托盤的應(yīng)用
本篇文章介紹了,基于java開發(fā)之系統(tǒng)托盤的應(yīng)用。需要的朋友參考下2013-05-05