java報文
『壹』 java Socket開發 關於報文傳遞和接收
看 Oracle 官方教程,同步式的 Socket 就是傳統的一問一答方式,它就是你需要的。
客戶端先 socket.getOutputStream().write(...); 之後到 socket.getInputStream().read(byte[]) 在循環中讀取直到 read 方法返回 -1 或你期望的位元組數已經全部收到了就停下來,如果不嘗試停下來,後面的 read 將會阻塞等待。
http://docs.oracle.com/javase/tutorial/networking/sockets/index.html
基於性能改進,一般我們需要使用 NIO 非同步的 socket,只需要一個線程負責通信,每個線程都有自己的出站消息隊列和入站消息隊列,以線程為 key 區分開,通信線程只負責把各自的消息從出站隊列中發送去並把收到的消息放入入站隊列中,應用程序線程就去各自的消息隊列中取消息就可以了。因為每個應用線程有各自的消息隊列,我們把消息放入出站隊列之後就到入站隊列上用同步鎖等待的方法阻塞到有消息回答時為止。
關於 NIO non-blocking 非阻塞式 socket,下面有一個 NBTimeServer 例子,它講的是服務端。客戶端與此類似,
http://docs.oracle.com/javase/7/docs/technotes/guides/io/example/index.html
NIO 通信線程樣例。
publicvoidrun()
{
inttip=0;
try
{
selector=Selector.open();
SelectionKeyk=channel.register(selector,getInterestOptions());
k.attach(thread);//把當前線程綁定到附件中。
this.running=true;
statusChanged(Status.CONNECTED);
while(this.isRunning())
{
//select()isablockingoperation.
inteventCount=selector.select();
debug("[MC.Debug]PollingTCPevents..."+eventCount);
if(eventCount>0&&channel.isOpen()&&this.isRunning())
{
Setkeys=selector.selectedKeys();
for(Iteratoriter=keys.iterator();iter.hasNext();iter.remove())
{
SelectionKeykey=(SelectionKey)iter.next();
Threadthread=(Thread)key.attachment();
if(!key.isValid())
{//channelisclosing.
break;
}
process(key);//處理讀取消息並把消息放入thread對應的隊列。//寫出消息類似的,不過在register時需要注冊寫出允許的事件,
}
}
}
}
『貳』 如何實現java解析網路協議報文
普通參數:
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
文件參數:
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
參數實體的最後一行是: --加上boundary加上--,最後換行,這里的 格式即為: --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp--。
模擬文件上傳請求
public static void uploadFile(String fileName) {
try {
// 換行符
final String newLine = "\r\n";
final String boundaryPrefix = "--";
// 定義數據分隔線
String BOUNDARY = "========7d4a6d158c9";
// 伺服器的域名
URL url = new URL("www.myhost.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 設置為POST情
conn.setRequestMethod("POST");
// 發送POST請求必須設置如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 設置請求頭參數
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("Charsert", "UTF-8");
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
OutputStream out = new DataOutputStream(conn.getOutputStream());
// 上傳文件
File file = new File(fileName);
StringBuilder sb = new StringBuilder();
sb.append(boundaryPrefix);
sb.append(BOUNDARY);
sb.append(newLine);
// 文件參數,photo參數名可以隨意修改
sb.append("Content-Disposition: form-data;name=\"photo\";filename=\"" + fileName
+ "\"" + newLine);
sb.append("Content-Type:application/octet-stream");
// 參數頭設置完以後需要兩個換行,然後才是參數內容
sb.append(newLine);
sb.append(newLine);
// 將參數頭的數據寫入到輸出流中
out.write(sb.toString().getBytes());
// 數據輸入流,用於讀取文件數據
DataInputStream in = new DataInputStream(new FileInputStream(
file));
byte[] bufferOut = new byte[1024];
int bytes = 0;
// 每次讀1KB數據,並且將文件數據寫入到輸出流中
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
// 最後添加換行
out.write(newLine.getBytes());
in.close();
// 定義最後數據分隔線,即--加上BOUNDARY再加上--。
byte[] end_data = (newLine + boundaryPrefix + BOUNDARY + boundaryPrefix + newLine)
.getBytes();
// 寫上結尾標識
out.write(end_data);
out.flush();
out.close();
// 定義BufferedReader輸入流來讀取URL的響應
// BufferedReader reader = new BufferedReader(new InputStreamReader(
// conn.getInputStream()));
// String line = null;
// while ((line = reader.readLine()) != null) {
// System.out.println(line);
// }
} catch (Exception e) {
System.out.println("發送POST請求出現異常!" + e);
e.printStackTrace();
}
}
『叄』 JAVA解析發送tcp ip報文
JAVA 寫一個SOCKET 伺服器,接收、處理單片機遞交上來的數據
通過文字輸入流,直接可以當字元處理的。也很方便輸出返饋。
『肆』 用java代碼怎樣將報文A生成報文的某個值傳遞給報文B中的某個欄位
看 Oracle 官方教程,同步式的 Socket 就是傳統的一問一答方式,它就是你需要的。
客戶端先 socket.getOutputStream().write(...); 之後到 socket.getInputStream().read(byte[]) 在循環中讀取直到 read 方法返回 -1 或你期望的位元組數已經全部收到了就停下來,如果不嘗試停下來,後面的 read 將會阻塞等待。
http://docs.oracle.com/javase/tutorial/networking/sockets/index.html
基於性能改進,一般我們需要使用 NIO 非同步的 socket,只需要一個線程負責通信,每個線程都有自己的出站消息隊列和入站消息隊列,以線程為 key 區分開,通信線程只負責把各自的消息從出站隊列中發送去並把收到的消息放入入站隊列中,應用程序線程就去各自的消息隊列中取消息就可以了。因為每個應用線程有各自的消息隊列,我們把消息放入出站隊列之後就到入站隊列上用同步鎖等待的方法阻塞到有消息回答時為止。
關於 NIO non-blocking 非阻塞式 socket,下面有一個 NBTimeServer 例子,它講的是服務端。客戶端與此類似,
http://docs.oracle.com/javase/7/docs/technotes/guides/io/example/index.html
『伍』 java解析報文
ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
if (bb.remaining() < MIN_HEADER_LENGTH) {
return this;
}
this.opCode = bb.get();
this.transactionId = bb.getInt();
按照這種節奏搞吧,這個很簡單的啊,拿到BYTEBUFFER以後,一點一點的處理byte。
『陸』 java怎麼解析文本文件中的soap報文
首先,通過流的方式讀取txt中soap報文字元串。第二步,通過dom4j讀取soap報文字元串進行解析(常規的xml解析)
『柒』 java中報文啥時候用呢一直搞不懂
你可以了解一下http協議
報文就是一組客戶端和服務端都認可的信息數據。可以是xml形式,json格式。等等
比如有一個android客戶端向服務端發送登陸報文
<user>
<username></username>
<password>123456</password>
</user>
這段由客戶端到服務端的xml,就可以視為一個上行報文
服務端收到報文後會返回登陸成功或者失敗的信息
比如:200(成功)
404 (失敗)
甚至返回更詳細的失敗信息等等這個由服務端到客戶端的返回信息同樣可以是多樣性,可視為下行報文
『捌』 如何用java發送http報文
給你一個吧,這個能抓取任何程序
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class WebClient{
public static String getWebContent(String urlString,final String charset,int timeout) throws IOException {
if(urlString==null||urlString.length()==0) {
return null;
}
urlString = (urlString.startsWith("http://") || urlString
.startsWith("https://")) ? urlString : ("http://" + urlString)
.intern();
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn
.setRequestProperty(
"User-Agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");//增加報頭,模擬瀏覽器,防止屏蔽
conn.setRequestProperty("Accept", "text/html");//只接受text/html類型,當然也可以接受圖片,pdf,*/*任意,就是tomcat/conf/web裡面定義那些
conn.setConnectTimeout(timeout);
try {
if(conn.getResponseCode()!=HttpURLConnection.HTTP_OK) {
return null;
}
} catch (IOException e) {
e.printStackTrace();
return null;
}
InputStream input = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input,
charset));
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = reader.readLine()) != null) {
sb.append(line).append("\r\n");
}
if(reader!=null) {
reader.close();
}
if(conn!=null) {
conn.disconnect();
}
return sb.toString();
}
public static String getWebContent(String urlString) throws IOException {
return getWebContent(urlString,"iso-8859-1",5000);
}
public static void main(String[]args) throws IOException {
String s = getWebContent("http://www.sina.com");
s = new String(s.getBytes("iso-8859-1"),"gb2312");
System.out.println(s);
}
}
『玖』 java 解析數據報文
數據報文有很多協議的
你要分析的那種?
其實那種都大同小異
用DatagramSocket類和DatagramPacket類
socket建立連接
packet取得數據報
然後對不同的類型進行分析咯
『拾』 怎麼樣用java發送Tcp報文
你可以用socket編程,java socket是封裝了TCP協議的,不需要你去設置裡面的一些參數了。
你還可以用java jpcap編寫,這個可以發送接收arp,tcp,udp,icmp等各種報文