導航:首頁 > 編程語言 > javatcp封裝

javatcp封裝

發布時間:2025-08-17 23:27:17

A. 在java中實現TCP協議編程中怎麼傳

在Java中實現TCP協議編程

ServerSocket:編寫TCP網路服務程序,首先要用到java.net.ServerSocket類用以創建伺服器Socket

構造方法:

ServerSocket(intport):創建綁定到特定埠的伺服器套接字

ServerSocket(intport,intbacklog):利用指定的backlog(伺服器忙時保持連接請求的等待客戶數量),創建伺服器套接字並將其綁定到指定的本地埠號。

ServerSocket(intport,intbacklog,InetAddressbindAddr):使用指定的埠、偵聽backlog和要綁定到的本地IP地址創建伺服器。

Socket:客戶端要與伺服器建立連接,必須先創建一個Socket對象

常用構造方法

Socket(Stringhost,intport):創建一個流套接字並將其連接到指定主機上的指定埠號。

Socket(InetAddressaddress,intport):創建一個流套接字並將其連接到指定IP地址的指定埠號。

伺服器端程序調用ServerSocket類中的accept()方法等待客戶端的連接請求,一旦accept()接收了客戶端連接請求,該方法返回一個與該客戶端建立了專線連接的Socket對象,不用程序去創建這個Socket對象。建立了連接的兩個Socket是以IO流的方式進行數據交換的,Java提供了Socket類中的getInputStream()返回Socket的輸入流對象,getOutputStream()返回Socket的輸出流對象。

TCP伺服器與TCP客戶端間的數據的接受圖示:

用TCP實現伺服器與客戶端的「聊天」:

實例代碼

客戶端:

packagecom.hbsi.net;

importjava.net.Socket;

importjava.io.*;

publicclassTcpClient{

publicstaticvoidmain(String[]args)throwsException{

//1.建立tcp客戶端socket,要確定要連接的伺服器ip,port

Sockets=newSocket("192.168.49.87",9009);

//獲取鍵盤錄入

BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));

//2.通過建立的socket,獲取輸出流對象

//數據輸出給伺服器端

OutputStreamout=s.getOutputStream();

BufferedWriterbwout=newBufferedWriter(newOutputStreamWriter(out));

//獲取伺服器端返回的數據

//讀取伺服器端發過來的信息InputStreamReader()

BufferedReaderbrin=newBufferedReader(newInputStreamReader(

s.getInputStream()));

Stringline=null;

while((line=br.readLine())!=null){

if(line.equals("over"))

break;

bwout.write(line);

bwout.newLine();

bwout.flush();

Stringstr=brin.readLine();

System.out.println("server:"+str);

}

br.close();

s.close();

}

}

伺服器端:

packagecom.hbsi.net;

importjava.io.BufferedReader;

importjava.io.BufferedWriter;

importjava.io.InputStream;

importjava.io.InputStreamReader;

importjava.io.OutputStreamWriter;

importjava.net.ServerSocket;

importjava.net.Socket;

publicclassTcpServer{

publicstaticvoidmain(String[]args)throwsException{

//1.建立伺服器socket

ServerSocketss=newServerSocket(9009);

//2.調用accept()

Sockets=ss.accept();

System.out.println(s.getInetAddress().getHostAddress()

+"...connection");

//讀取客戶的信息的輸入流

InputStreamin=s.getInputStream();

BufferedReaderbrin=newBufferedReader(newInputStreamReader(in));

//向客戶端發送信息輸出流,服務端向客戶端返回信息OutputStreamWriter()

BufferedWriterbrout=newBufferedWriter(newOutputStreamWriter(

s.getOutputStream())); Stringline=null;

while((line=brin.readLine())!=null){

System.out.println("client:"+line);

brout.write(line.toUpperCase());//伺服器端收到信息後,將信息轉為大寫返回給客戶端toUpperCase()

brout.newLine();

brout.flush();

}

s.close();

ss.close();

}

}

B. TCP/IP協議 怎麼用JAVA發送和接收二進制數據 要具體實例

1.TCP/IP協議要求信息必須在塊(chunk)中發送和接收,而塊的長度必須是8位的倍數,因此,我們可以認為TCP/IP協議中傳輸的信息是位元組序列。如何發送和解析信息需要一定的應用程序協議。

2.信息編碼:

首先是Java里對基本整型的處理,發送時,要注意:1)每種數據類型的位元組個數;2)這些位元組的發送順序是怎樣的?(little-endian還是
big-endian);3)所傳輸的數值是有符號的(signed)還是無符號的(unsigned)。具體編碼時採用位操作(移位和屏蔽)就可以了。
具體在Java里,可以採用DataOutputStream類和ByteArrayOutputStream來實現。恢復時可以採用
DataInputStream類和ByteArrayInputStream類。

其次,字元串和文本,在一組符號與一組整數之間的映射稱為編碼字元集(coded character
set)。發送者與接收者必須在符號與整數的映射方式上達成共識,才能使用文本信息進行通信,最簡單的方法就是定義一個標准字元集。具體編碼時採用
String的getBytes()方法。

最後,位操作。如果設置一個特定的設為1,先設置好掩碼(mask),之後用或操作;要清空特定一位,用與操作。

3.成幀與解析

成幀(framing)技術解決了接收端如何定位消息的首位位置的問題。

如果接收者試圖從套接字中讀取比消息本身更多的位元組,將可能發生以下兩種情況之一:如果信道中沒有其他消息,接收者將阻塞等待,同時無法處理接收
到的消息;如果發送者也在等待接收端的響應消息,則會形成死鎖(dealock);另一方面,如果信道中還有其他消息,則接收者會將後面消息的一部分甚至
全部讀到第一條消息中去,這將產生一些協議錯誤。因此,在使用TCP套接字時,成幀就是一個非常重要的考慮因素。

有兩個技術:

1.基於定界符(Delimiter-based):消息的結束由一個唯一的標記(unique
marker)指出,即發送者在傳輸完數據後顯式添加的一個特殊位元組序列。這個特殊標記不能在傳輸的數據中出現。幸運的是,填充(stuffing)技術
能夠對消息中出現的定界符進行修改,從而使接收者不將其識別為定界符。在接收者掃描定界符時,還能識別出修改過的數據,並在輸出消息中對其進行還原,從而
使其與原始消息一致。

2.顯式長度(Explicit length):在變長欄位或消息前附加一個固定大小的欄位,用來指示該欄位或消息中包含了多少位元組。這種方法要確定消息長度的上限,以確定保存這個長度需要的位元組數。

介面:

Java代碼 import java.io.IOException; import java.io.OutputStream; public interface Framer { void frameMsg(byte [] message,OutputStream out) throws IOException; byte [] nextMsg() throws IOException; }
定界符的方式:

Java代碼 import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class DelimFramer implements Framer { private InputStream in;//data source; private static final byte DELIMTER=(byte)'\n';//message delimiter public DelimFramer(InputStream in){ this.in=in; } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { //ensure that the message dose not contain the delimiter for(byte b:message){ if(b==DELIMTER) throw new IOException("Message contains delimiter"); } out.write(message); out.write(DELIMTER); out.flush(); } @Override public byte[] nextMsg() throws IOException { ByteArrayOutputStream messageBuffer=new ByteArrayOutputStream(); int nextByte; while((nextByte=in.read())!=DELIMTER){ if(nextByte==-1){//end of stream? if(messageBuffer.size()==0){ return null; }else{ throw new EOFException("Non-empty message without delimiter"); } } messageBuffer.write(nextByte); } return messageBuffer.toByteArray(); } }
顯式長度方法:

Java代碼 import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class LengthFramer implements Framer { public static final int MAXMESSAGELENGTH=65535; public static final int BYTEMASK=0xff; public static final int SHOTMASK=0xffff; public static final int BYTESHIFT=8; private DataInputStream in;// wrapper for data I/O public LengthFramer(InputStream in) throws IOException{ this.in=new DataInputStream(in); } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { if(message.length>MAXMESSAGELENGTH){ throw new IOException("message too long"); } //write length prefix out.write((message.length>>BYTEMASK)&BYTEMASK); out.write(message.length&BYTEMASK); //write message out.write(message); out.flush(); } @Override public byte[] nextMsg() throws IOException { int length; try{ length=in.readUnsignedShort(); }catch(EOFException e){ //no (or 1 byte) message; return null; } //0<=length<=65535; byte [] msg=new byte[length]; in.readFully(msg);//if exception,it's a framing error; return msg; } }

C. android或java 用jnetpcap可以發送icmp報文嗎

你可以用socket編程,java socket是封裝了TCP協議的,不需要你去設置裡面的一些參數了。 你還可以用java jpcap編寫,這個可以發送接收arp,tcp,udp,icmp等各種報文

D. 請教大神,java socket介面,TCP長連接,怎麼解析和發送一種協議格式數據包

建議你下載我的java版本至尊聊天程序源碼下去參考。在CSDN或網路上找吧。
協議完全回自己來定製,答數據以位元組發送,以什麼開始,什麼結束,中間分幾段,都可由你自己來定,接收時,就按你定的規則來解析並還原。比如:我要的協議格式為
:>10:3:5:content:<
:>表示一條消息的開始。
10表示總消息長度(只是個代數,有可能不是10,需要你在發送前計算)
:為分隔符
3為頭消息長度,也可能不是3
5表示後面的消息內容長度,甚至還可以定製,是否有圖片,從多少位置開始是圖片的數據。
:<表示結束標志
沒有人限制你的協議。
關鍵一點:你在收取的時候,一定要注意數據可能會粘包,這個問題很頭疼的。因為一般都是多線程模式。這需要你自己來處理它。一言難清。可以參考我的聊天程序。

E. java中的socket編程是作什麼的

Socket,又稱為套接字,是計算機網路通信的基本技術之一。如今,大多數基於網路的軟體,如瀏覽器、即時通訊工具甚至是P2P下載,都是基於Socket實現的。本文將介紹基於TCP/IP的Socket編程,並展示如何編寫客戶端和伺服器程序。

在接下來的示例中,我們將使用基於TCP/IP協議的Socket編程,因為這個協議在實際應用中比UDP/IP更為廣泛。所有與Socket相關的類都位於java.net包下,因此在進行Socket編程時需要引入這個包。

接下來是寫入數據的過程。客戶端的Socket對象可以得到一個OutputStream對象,然後可以通過這個對象寫入數據,類似於文件輸入輸出的處理代碼。

打開伺服器端的Socket也很簡單。通過Socket對象,可以獲取一個InputStream對象,然後像處理文件輸入輸出一樣讀取數據。這里我們將讀取的數據列印出來。

使用Socket實現一個回聲伺服器的功能,就是伺服器會將客戶端發送過來的數據傳回給客戶端。具體實現時,伺服器端會監聽特定的埠,當有客戶端連接時,伺服器會接收客戶端發送的數據,並將這些數據原樣返回給客戶端。

客戶端則需要知道伺服器的IP地址和埠號,然後通過Socket對象建立與伺服器的連接。客戶端發送數據後,會等待伺服器的響應,伺服器接收到數據後,會將數據返回給客戶端。客戶端接收到返回的數據後,就可以處理這些數據了。

Socket編程是構建網路應用的重要基礎,通過上述示例,我們可以看到Socket的使用並不復雜。只要掌握了基本的Socket編程方法,就可以開發出各種基於網路的應用程序。

F. Java面試之TCP的粘包和拆包

Java面試之TCP的粘包和拆包

在TCP協議中,數據的發送和接收都是以流的形式進行的,而發送的數據是以數據包的形式封裝的。然而,接收方並不能確定每次讀取到的數據包大小,因此會出現TCP粘包和拆包問題。

一、TCP粘包和拆包的概念

二、造成粘包和拆包的原因

造成粘包現象的原因

造成拆包現象的原因

三、解決TCP粘包和拆包問題的方法

  1. 定長消息

    原理:發送方每次發送固定長度的數據,接收方按照固定長度進行接收和處理。

    優點:實現簡單,易於理解。

    缺點:靈活性差,不適用於數據長度變化較大的場景。

  2. 特定字元分割消息

    原理:發送方在每個數據包後面加上特定的字元(例如「rn」),接收方以該字元為標志進行數據拆分。

    優點:實現相對簡單,適用於文本數據的傳輸。

    缺點:特定字元可能與數據內容沖突,導致數據解析錯誤。

  3. 將消息分為消息頭和消息體

    原理:消息頭記錄消息的長度等信息,接收方先接收消息頭,然後根據消息頭中的長度信息接收消息體。

    優點:靈活性好,適用於數據長度變化較大的場景。

    缺點:需要額外的空間來存儲消息頭信息。

  4. 使用消息結束符

    原理:發送方在每個數據包的末尾添加一個特定的消息結束符(例如「0」),接收方接收到消息結束符時,就認為一條消息接收完成。

    優點:實現簡單,易於理解。

    缺點:消息結束符可能與數據內容沖突,導致數據解析錯誤;同時,如果數據中包含大量零值位元組,可能會增加解析的復雜性。

  5. 利用應用層協議

    原理:在應用層協議中定義數據包的格式和長度信息,如HTTP協議中的Content-Length欄位。接收方在接收數據時,根據應用層協議中的長度信息來精確地讀取整個數據。

    優點:標准化、規范化,易於實現和維護。

    缺點:需要額外的協議開銷,可能增加數據傳輸的復雜性。

綜上所述,TCP粘包和拆包問題是網路編程中常見的問題,需要根據具體的應用場景選擇合適的解決方法。在實際開發中,可以結合多種方法來解決粘包和拆包問題,以提高數據傳輸的可靠性和准確性。

閱讀全文

與javatcp封裝相關的資料

熱點內容
asp無組件上傳多文件 瀏覽:709
為什麼我的高德地圖沒有網路了 瀏覽:657
心臟監護儀黃色的是什麼數據 瀏覽:713
怎麼把桌面的文件隱藏的文件夾圖標 瀏覽:280
造價要依據哪些文件 瀏覽:499
除了按鍵找圖還有什麼編程軟體 瀏覽:352
什麼是網路作文 瀏覽:454
7個字的文件夾 瀏覽:614
表格中兩列數據條如何合並 瀏覽:872
javatcp封裝 瀏覽:497
word文檔紅頭文件標題怎麼製作 瀏覽:553
app20什麼意思 瀏覽:998
如何判斷數據是否正態分布 瀏覽:551
電腦微信聊天記錄搜索不到文件 瀏覽:190
word標題設計 瀏覽:495
oppo主題的文件夾是哪個 瀏覽:491
電腦文件發到朋友圈 瀏覽:859
電商網站前後台模板 瀏覽:825
如何獲得許可權刪除文件 瀏覽:967
谷歌瀏覽器擴展程序暫時無法載入 瀏覽:910

友情鏈接