久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

java?socket實現(xiàn)局域網(wǎng)聊天

這篇文章主要為大家詳細介紹了java?socket實現(xiàn)局域網(wǎng)聊天,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

使用socket實現(xiàn)局域網(wǎng)聊天,寫這個主要是為了深入理解socket與信息流在網(wǎng)絡(luò)中的傳送過程加深理解。

代碼很簡單分為兩個類,一個服務(wù)器類,一個客戶端,運行時分別啟動兩個線程一個負責(zé)接受另一個負責(zé)發(fā)送。

整體流程是 兩臺機器分別啟動程序,一個選擇主動連接 另一個選擇被動接受,即可實現(xiàn)類似qq的聊天效果兩個人可以同時發(fā)送消息。

注意的事,不要在同一臺電腦上同時啟動兩個,這樣會服務(wù)端和客戶端的ip都是相同很有可能造成自己發(fā)送的消息自己接受到了,可以兩臺電腦或者虛擬機里面進行。

服務(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 進行連接反向連
?? ? * @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();
?? ?}
?
}

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持html5模板網(wǎng)。

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

堆(優(yōu)先隊列)是一種典型的數(shù)據(jù)結(jié)構(gòu),其形狀是一棵完全二叉樹,一般用于求解topk問題。本文將利用Java語言實現(xiàn)堆,感興趣的可以學(xué)習(xí)一下
Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計算一個節(jié)點到其他所有節(jié)點的最短路徑。本文將詳解該算法的圖解與實現(xiàn),需要的可以參考一下
這篇文章主要介紹了Java中ThreadLocal導(dǎo)致內(nèi)存OOM的原因分析,文章基于Java的相關(guān)內(nèi)容展開ThreadLocal導(dǎo)致內(nèi)存OOM的原因分析,需要的小伙v阿布可以參考一下
這篇文章主要介紹了Java中CyclicBarrier?循環(huán)屏障,可以實現(xiàn)讓一組線程等待至某個狀態(tài)屏障點之后再全部同時執(zhí)行,下面文章分享CyclicBarrier循環(huán)屏障的原理,需要的小伙伴可以參考一下
這篇文章主要介紹了利用Java代碼寫一個并行調(diào)用模板,文章基于Java的相關(guān)內(nèi)容展開寫一個并行調(diào)用模板的詳細介紹,具有一定的參考價值,需要的小伙伴可以參考一下
API(Application?Programming?Interface)應(yīng)用程序編程接口,java?API是一本程序員字典,是JDK提供給我們使用的類的說明文檔,下面這篇文章主要給大家介紹了關(guān)于Java高版本Api在Android中的使用方法,需
主站蜘蛛池模板: 涩涩片影院 | 国产黄色精品在线观看 | 精品久久久久久久久久 | 欧美国产激情二区三区 | 国产一二区视频 | 热99精品视频 | 一区二区日韩精品 | 欧美精品电影一区 | 欧美一级特黄aaa大片在线观看 | 日韩精品久久久 | 色在线视频网站 | 91精品国产欧美一区二区 | 日韩久久久久久久久久久 | 国产成人综合在线 | 久久精品成人一区 | 欧美激情亚洲 | 欧美乱做爰xxxⅹ久久久 | 欧美激情精品久久久久久变态 | 亚洲一区二区三区在线视频 | 国产成人亚洲精品 | 日韩精品一区二区三区视频播放 | av一区在线| 天堂一区二区三区 | 国产一区二区三区在线看 | 日韩毛片免费看 | av黄色在线 | 精品国产91久久久久久 | 国产精品一卡 | 亚洲日本视频 | 精品国产鲁一鲁一区二区张丽 | 国产在线一区观看 | 久亚州在线播放 | 国产精品久久久久久52avav | 一级片免费观看 | 天天搞天天操 | 亚洲精品888 | 久热中文字幕 | 色爱综合| 亚洲欧美综合精品久久成人 | 中文字幕视频一区二区 | 99国产精品久久久久久久 |