java的socket包
1. java中的socket是什麼意思
socket通常也稱作"套接字",用於描述IP地址和埠,是一個通信鏈的句柄。應用程序通常通過"套接字"向網路發出請求或者應答網路請求。
-----J2SDK-1.3為例,Socket和ServerSocket類庫位於java.net包中。ServerSocket用於伺服器端,Socket是建立網路連接時使用的。在連接成功時,應用程序兩端都會產生一個Socket實例,操作這個實例,完成所需的會話。對於一個網路連接來說,套接字是平等的,並沒有差別,不因為在伺服器端或在客戶端而產生不同級別。不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。
給你一個例子:
服務端例子:
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassServerDemo{
/**
*注意:Socket的發送與接收是需要同步進行的,即客戶端發送一條信息,伺服器必需先接收這條信息,
*而後才可以向客戶端發送信息,否則將會有運行時出錯。
*@paramargs
*/
publicstaticvoidmain(String[]args){
ServerSocketss=null;
try{
ss=newServerSocket(8888);
//伺服器接收到客戶端的數據後,創建與此客戶端對話的Socket
Socketsocket=ss.accept();
//用於向客戶端發送數據的輸出流
DataOutputStreamdos=newDataOutputStream(socket.getOutputStream());
//用於接收客戶端發來的數據的輸入流
DataInputStreamdis=newDataInputStream(socket.getInputStream());
System.out.println("伺服器接收到客戶端的連接請求:"+dis.readUTF());
//伺服器向客戶端發送連接成功確認信息
dos.writeUTF("接受連接請求,連接成功!");
//不需要繼續使用此連接時,關閉連接
socket.close();
ss.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
客戶端例子:
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.net.Socket;
importjava.net.UnknownHostException;
publicclassClientDemo{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
Socketsocket=null;
try{
socket=newSocket("localhost",8888);
//獲取輸出流,用於客戶端向伺服器端發送數據
DataOutputStreamdos=newDataOutputStream(socket.getOutputStream());
//獲取輸入流,用於接收伺服器端發送來的數據
DataInputStreamdis=newDataInputStream(socket.getInputStream());
//客戶端向伺服器端發送數據
dos.writeUTF("我是客戶端,請求連接!");
//列印出從伺服器端接收到的數據
System.out.println(dis.readUTF());
//不需要繼續使用此連接時,記得關閉哦
socket.close();
}catch(UnknownHostExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
2. 有沒有誰做過java方面對socket包協議解析的功能、比如它的頭部、body等等、是怎麼發送和接收處理的
默認的情況是和HTML的一樣的。 不過你可以通過設置response.setHeader啥的。
3. 如何使用java socket來傳輸自定義的數據包
自定義是什麼意思?是指定義數據包的大小,還是數據包中內容的格式
4. java怎麼處理socket服務端粘包
socket粘包是避免不了的,主要在於接收方如何解包和控制。處理方法:
定製socket傳輸協議。增加包頭、命令、數據長度、數據體、結束位。比如發送消息:,
String msg = "你好";
byte[] byBuffer = msg.getBytes();
//加入定製的協議該條數據位:
byte[] b = new byte[4+byBuffer.length];
b[0] = 0xFFFFF; //隨便定義,包頭
b[1] = 0x01; //命令
b[2] = byBuffer.length; //數據長度
b[3 - n] = byBuffer; //數據
b[b.length -1] = 0x0d; //結束
接收方接收到該數據後判斷包頭是否一致,不一致則不要,根據b[2]數據長度來去數據,第一次未接收完繼續接收第二次,直到接收數據長度==b[2]為止。一條完整的數據就出來了。
寫得很隨意,理解理解~
5. java中Socket的心跳包設置問題
使用一個線程進行監控,如果空閑一定時間就發送一個心跳包。對於非同步Socket可以一個線程監控多個連接。
6. java socket 如何發送指定協議的數據包
通信協議是自己定義的數據格式
然後通過大概以下方法調用
{
String host;
int port;
byte[] data;
Socket s=new Socket(host,port);
OutputStream out = s.getOutputStream();
out.write(data);
out.close();
s.close();
}
7. java DatagramSocket receive 方法 接收 多個包
多線程,用一個線程監聽,如果接到包,創建一個線程處理,繼續監聽。保證一直有一個線程在監聽就可以了。
8. JAVA Socket
呵呵,我學Java也遇到了很多問題,有時候都不知道怎麼辦才好。學習一門語言不是件容易的事情,要堅持下去!我能說的也就只有這些了,怎麼做還要看你自己!
加油吧!
9. java中Socket如何實現數據包傳輸的打包和解包
socket一般調用accept方法等待連接:
public class ServerThread extends Thread{
ServicePanel servicePanel = null;
ServerSocket serverSocket = null;
Socket socket = null;
public ServerThread(ServicePanel servicePanel,ServerSocket serverSocket) {
this.servicePanel = servicePanel;
this.serverSocket = serverSocket;
}
public void run(){
while (true) {
try {
socket = serverSocket.accept();//等待連接
new ReciveFromClient(servicePanel,socket).start();
} catch (IOException e) {
// e.printStackTrace();
break;
}
}
}
}
至於收包,發包是以流的形式傳送的:
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
一般包裡面的內容也就是被我們封裝在某個類中,這個類要實現序列化,即實現Serializable介面;
發送方法那些就要自己寫了~