???? socket通信分為tcp和udp兩種。
?
? 1、 Socket通信模型如下:
? 2、
?UDP協(xié)議:
?????? 把數(shù)據(jù)打包成數(shù)據(jù)包,然后直接發(fā)送對(duì)應(yīng)的ip地址,速度快,但是不保證成功率,并且數(shù)據(jù)大小有限
TCP協(xié)議:
?????? 首先連接接收方,然后發(fā)送數(shù)據(jù),保證成功率, 速度慢
3、 TCP通信方式如下:
?
而UDP通信不使用InputStream和OutputStream
?
4、 UDP通信實(shí)現(xiàn):
UDP使用DatagramSocket對(duì)象來(lái)實(shí)現(xiàn),UDP的客戶(hù)端代碼實(shí)現(xiàn)如下:
?
public static void main(String[] args) { try { // 首先創(chuàng)建一個(gè)DatagramSocket對(duì)象 DatagramSocket socket = new DatagramSocket(4567); // 創(chuàng)建一個(gè)InetAddree InetAddress serverAddress = InetAddress.getByName("192.168.1.104"); String str = "hello"; // 這是要傳輸?shù)臄?shù)據(jù) byte data[] = str.getBytes(); // 把傳輸內(nèi)容分解成字節(jié) // 創(chuàng)建一個(gè)DatagramPacket對(duì)象,并指定要講這個(gè)數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)當(dāng)中的哪個(gè)、地址,以及端口號(hào) DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, 4567); // 調(diào)用socket對(duì)象的send方法,發(fā)送數(shù)據(jù) socket.send(packet); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
? UDP的服務(wù)端代碼實(shí)現(xiàn)如下:
// 創(chuàng)建一個(gè)DatagramSocket對(duì)象,并指定監(jiān)聽(tīng)的端口號(hào) DatagramSocket socket = new DatagramSocket(4567); byte data[] = new byte[1024]; // 創(chuàng)建一個(gè)空的DatagramPacket對(duì)象 DatagramPacket packet = new DatagramPacket(data, data.length); // 使用receive方法接收客戶(hù)端所發(fā)送的數(shù)據(jù), // 如果客戶(hù)端沒(méi)有發(fā)送數(shù)據(jù),該進(jìn)程就停滯在這里 socket.receive(packet); String result = new String(packet.getData(), packet.getOffset(), packet.getLength()); System.out.println("result--->" + result);
?
5、? TCP通信的實(shí)現(xiàn):
TCP使用Socket對(duì)象
TCP協(xié)議客戶(hù)端實(shí)現(xiàn):
// 創(chuàng)建一個(gè)Socket對(duì)象,指定服務(wù)器端的IP地址和端口號(hào) Socket socket = new Socket("192.168.1.104", 4567); // 使用InputStream讀取硬盤(pán)上的文件 InputStream inputStream = new FileInputStream("f://file/words.txt"); // 從Socket當(dāng)中得到OutputStream OutputStream outputStream = socket.getOutputStream(); byte buffer[] = new byte[4 * 1024]; int temp = 0; // 將InputStream當(dāng)中的數(shù)據(jù)取出,并寫(xiě)入到OutputStream當(dāng)中 while ((temp = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, temp); } outputStream.flush();
?
TCP協(xié)議服務(wù)器端現(xiàn)實(shí):
//聲明一個(gè)ServerSocket對(duì)象 ServerSocket serverSocket = null; try { //創(chuàng)建一個(gè)ServerSocket對(duì)象,并讓這個(gè)Socket在4567端口監(jiān)聽(tīng) serverSocket = new ServerSocket(4567); //調(diào)用ServerSocket的accept()方法,接受客戶(hù)端所發(fā)送的請(qǐng)求, //如果客戶(hù)端沒(méi)有發(fā)送數(shù)據(jù),那么該線程就停滯不繼續(xù) Socket socket = serverSocket.accept(); //從Socket當(dāng)中得到InputStream對(duì)象 InputStream inputStream = socket.getInputStream(); byte buffer [] = new byte[1024*4]; int temp = 0; //從InputStream當(dāng)中讀取客戶(hù)端所發(fā)送的數(shù)據(jù) while((temp = inputStream.read(buffer)) != -1){ System.out.println(new String(buffer,0,temp)); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } serverSocket.close(); }
?
摘自他人博客,未經(jīng)驗(yàn)證,但是覺(jué)得很好。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
