Java實現(xiàn)一個簡易聊天室流程
說到網(wǎng)絡(luò),相信大家都對TCP、UDP和HTTP協(xié)議這些都不是很陌生,學(xué)習(xí)這部分應(yīng)該先對端口、Ip地址這些基礎(chǔ)知識有一定了解,后面我們都是直接上demo來解釋代碼
文件傳輸
Tcp方式
這里我們指的是C/S架構(gòu)的文件傳輸,需要涉及一個客戶端Client和服務(wù)器端(Server),這里采用的是TCP協(xié)議進(jìn)行傳輸?shù)模琓CP需要經(jīng)過三次握手和四次揮手,需要注意的是Client上傳文件我們需要告訴服務(wù)器,我已經(jīng)傳輸完成了socket.shutdownOutput()。
服務(wù)器
import java.io.*; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; public class TestServerUpload { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(9999); Socket socket = serverSocket.accept(); // 或去輸入 InputStream is = socket.getInputStream(); FileOutputStream outputStream = new FileOutputStream(new File("receive.jpg")); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } OutputStream outputStream1 = socket.getOutputStream(); outputStream1.write("我接收完畢了".getBytes()); is.close(); outputStream.close(); serverSocket.close(); serverSocket.close(); outputStream1.close(); } }
客戶端
import java.io.*; import java.net.InetAddress; import java.net.Socket; public class TestClientUpload { public static void main(String[] args) throws Exception { Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9999); // 創(chuàng)建輸出流 OutputStream outputStream = socket.getOutputStream(); FileInputStream fileInputStream = new FileInputStream(new File("1.jpg")); byte[] buffer = new byte[1024]; int len; while (((len = fileInputStream.read(buffer))) != -1) { outputStream.write(buffer, 0, len); } // 通知服務(wù)器我已經(jīng)結(jié)束了 socket.shutdownOutput(); InputStream inputStream = socket.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer2 = new byte[1024]; int len2; while ((len2 = inputStream.read(buffer2)) != -1) { baos.write(buffer2, 0, len2); } System.out.println(baos.toString()); socket.close(); fileInputStream.close(); outputStream.close(); inputStream.close(); baos.close(); } }
Udp 方式
UDP是一種只管發(fā)送,不需要確保你已經(jīng)接收的通信協(xié)議,就比如短信,我只管發(fā)送給您,但是不管有沒有接收到。
public class UdpClient { public static void main(String[] args) throws Exception { // 1. 建包 DatagramSocket socket = null; try { socket = new DatagramSocket(); } catch (SocketException e) { e.printStackTrace(); } // 2. 建個包 String msg = "早安呀,大勇"; InetAddress localhost = InetAddress.getByName("localhost"); int port = 9999; DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port); // 3. 發(fā)送包 socket.send(datagramPacket); socket.close(); } }
public class UdpServer { public static void main(String[] args) throws Exception{ // 開發(fā)端口 DatagramSocket socket = new DatagramSocket(9999); // 收包 byte[] buffer = new byte[1024]; DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length); // 阻塞接收 socket.receive(datagramPacket); System.out.println(new String(datagramPacket.getData(), 0, datagramPacket.getLength())); System.out.println(datagramPacket.getAddress().getHostAddress()); socket.close(); } }
簡易聊天室的實現(xiàn)
接收端
public class TalkReceive implements Runnable { DatagramSocket socket; private int port; private String msgFrom; public TalkReceive(int port, String msgFrom) { this.msgFrom = msgFrom; this.port = port; try { socket = new DatagramSocket(port); } catch (Exception e) { e.printStackTrace(); } } @Override public void run() { while (true) { try { byte[] buffer = new byte[1024]; DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length); socket.receive(datagramPacket); if (datagramPacket.getLength() > 0) { byte[] data = datagramPacket.getData(); String receiveDatas = new String(data, 0, data.length); System.out.println("接收到了"+ msgFrom + receiveDatas); if ("bye".equals(receiveDatas)) { break; } } } catch (Exception ex) { ex.printStackTrace(); } } socket.close(); } }
發(fā)送端
public class TalkSend implements Runnable { DatagramSocket socket = null; private int fromPort; private String toIp; private int toPort; BufferedReader reader = null; public TalkSend(int fromPort, String toIp, int port) { this.fromPort = fromPort; this.toIp = toIp; this.toPort = port; try { socket = new DatagramSocket(fromPort); reader = new BufferedReader(new InputStreamReader(System.in)); } catch (Exception e) { e.printStackTrace(); } } @Override public void run() { while (true) { try { String data = reader.readLine(); byte[] datas = data.getBytes(); DatagramPacket packet = new DatagramPacket(datas, 0, data.length(), new InetSocketAddress(this.toIp, toPort)); socket.send(packet); if ("bye".equals(data)) { break; } } catch (Exception e) { e.printStackTrace(); } // 數(shù)據(jù) } socket.close(); } }
啟動
public class TalkStudent { public static void main(String[] args) { new Thread(new TalkSend(7777, "localhost", 9999)).start(); new Thread(new TalkReceive(8888, "老師")).start(); } }
public class TalkTeacher { public static void main(String[] args) { new Thread(new TalkSend(5555, "localhost", 8888)).start(); new Thread(new TalkReceive(9999, "學(xué)生")).start(); } }
到此這篇關(guān)于Java實現(xiàn)一個簡易聊天室流程的文章就介紹到這了,更多相關(guān)Java聊天室內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java持久化框架Hibernate與Mybatis優(yōu)劣及選擇詳解
這篇文章主要介紹了Java持久化框架Hibernate與Mybatis優(yōu)劣及選擇詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05eclipse中自動生成構(gòu)造函數(shù)的兩種方法
下面小編就為大家?guī)硪黄猠clipse中自動生成構(gòu)造函數(shù)的兩種方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10SpringBoot+Spring Security+JWT實現(xiàn)RESTful Api權(quán)限控制的方法
這篇文章主要介紹了SpringBoot+Spring Security+JWT實現(xiàn)RESTful Api權(quán)限控制的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03在Mybatis中association標(biāo)簽多層嵌套的問題
這篇文章主要介紹了在Mybatis中association標(biāo)簽多層嵌套的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03