『壹』 java:伺服器如何檢測客戶端已經斷開
在客戶端退出之後,會出現socket連接中斷,此時是會拋出異常,在拋出異常時列印中斷的客戶端即可。
1. while(Binput.read()!= -1) 這種方法能判斷出客戶端輸入是否為空,客戶端斷開能跳出死循環,但是得到的數據卻從第二個開始了,所以這方法不適宜。
2. 在死循環中加入以下代碼:
try {
socket.sendUrgentData(0);
} catch (IOException e) {
done= false; //如果拋出了異常,那麼就是斷開連接了 跳出無限循環
}
『貳』 java如何通過tcp向指定的IP發送指令並獲得返回的包
以下是一個展示java使用tcp通訊的簡單例子,包括伺服器和客戶端代碼:x0dx0ax0dx0a/**x0dx0a *TCPServerx0dx0a */x0dx0aimport java.io.*;x0dx0aimport java.net.*;x0dx0aclass TCPServer{x0dx0a public static void main(String[] args)throws IOException{x0dx0a ServerSocket listen = new ServerSocket(5050);x0dx0a x0dx0a Socket server = listen.accept();x0dx0a InputStream in = server.getInputStream();x0dx0a OutputStream out = server.getOutputStream();x0dx0a char c = (char)in.read();x0dx0a System.out.println("收到:" + c);x0dx0a out.write('s');x0dx0a x0dx0a out.close();x0dx0a in.close();x0dx0a server.close();x0dx0a listen.close();x0dx0a }x0dx0a}x0dx0ax0dx0a/**x0dx0a *TCPClientx0dx0a */x0dx0aimport java.io.*;x0dx0aimport java.net.*;x0dx0aclass TCPClient{x0dx0a public static void main(String[] args)throws IOException{x0dx0a Socket client = new Socket("127.0.0.1" , 5050);x0dx0a InputStream in = client.getInputStream();x0dx0a OutputStream out = client.getOutputStream();x0dx0a x0dx0a out.write('c');x0dx0a char c = (char)in.read();x0dx0a System.out.println("收到:" + c);x0dx0a out.close();x0dx0a in.close();x0dx0a client.close();x0dx0a }x0dx0a}
『叄』 在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();
}
}
『肆』 鐤鐙侸ava璁蹭箟錛氫嬌鐢⊿ervletSocket鍒涘緩TCP鏈嶅姟鍣ㄧ
銆銆 浣跨敤ServletSocket鍒涘緩TCP鏈嶅姟鍣ㄧ
銆銆浠庡浘 涓鐪嬩笂鍘籘CP閫氫俊鐨勪袱涓閫氫俊瀹炰綋涔嬮棿騫舵病鏈夋湇鍔″櫒絝 瀹㈡埛絝涔嬪垎 浣嗛偅鏄涓や釜閫氫俊瀹炰綋宸茬粡寤虹珛鉶氭嫙閾捐礬涔嬪悗鐨勭ず鎰忓浘 鍦ㄤ袱涓閫氫俊瀹炰綋娌℃湁寤虹珛鉶氭嫙閾捐礬涔嬪墠 蹇呴』鏈変竴涓閫氫俊瀹炰綋鍏堝仛鍑 涓誨姩濮挎 涓誨姩鎺ユ敹鏉ヨ嚜鍏朵粬閫氫俊瀹炰綋鐨勮繛鎺ヨ鋒眰
銆銆Java涓鑳芥帴鍙楀叾浠栭氫俊瀹炰綋榪炴帴璇鋒眰鐨勭被鏄瘲erverSocket ServerSocket瀵硅薄鐢ㄤ簬鐩戝惉鏉ヨ嚜瀹㈡埛絝鐨凷ocket榪炴帴 濡傛灉娌℃湁榪炴帴 瀹冨皢涓鐩村勪簬絳夊緟鐘舵 ServerSocket鍖呭惈涓涓鐩戝惉鏉ヨ嚜瀹㈡埛絝榪炴帴璇鋒眰鐨勬柟娉
銆銆Socket accept錛堬級 濡傛灉鎺ユ敹鍒頒竴涓瀹㈡埛絝瘲ocket鐨勮繛鎺ヨ鋒眰 璇ユ柟娉曞皢榪斿洖涓涓涓庡㈡埛絝瘲ocket瀵瑰簲鐨凷ocket錛堝傚浘 鎵紺烘瘡涓猅CP榪炴帴鏈変袱涓猄ocket錛 鍚﹀垯璇ユ柟娉曞皢涓鐩村勪簬絳夊緟鐘舵 綰跨▼涔熻闃誨
銆銆涓轟簡鍒涘緩ServerSocket瀵硅薄 ServerSocket綾繪彁渚涗簡濡備笅鍑犱釜鏋勯犲櫒
銆銆ServerSocket錛坕nt port錛 鐢ㄦ寚瀹氱殑絝鍙port鏉ュ壋寤轟竴涓猄erverSocket 璇ョ鍙e簲璇ユ槸鏈変竴涓鏈夋晥鐨勭鍙f暣鏁板 ~
銆銆ServerSocket錛坕nt port int backlog錛 澧炲姞涓涓鐢ㄦ潵鏀瑰彉榪炴帴闃熷垪闀垮害鐨勫弬鏁癰acklog
銆銆ServerSocket錛坕nt port int backlog InetAddress localAddr錛 鍦ㄦ満鍣ㄥ瓨鍦ㄥ氫釜 IP鍦板潃鐨勬儏鍐典笅 鍏佽擱氳繃localAddr榪欎釜鍙傛暟鏉ユ寚瀹氬皢ServerSocket緇戝畾鍒版寚瀹氱殑IP鍦板潃
銆銆褰揝erverSocket浣跨敤瀹屾瘯 搴斾嬌鐢⊿erverSocket鐨刢lose錛堬級鏂規硶鏉ュ叧闂璇ServerSocket 閫氬父鎯呭喌涓 鏈嶅姟鍣ㄤ笉搴旇ュ彧鎺ュ彈涓涓瀹㈡埛絝璇鋒眰 鑰屽簲璇ヤ笉鏂鍦版帴鍙楁潵鑷瀹㈡埛絝鐨勬墍鏈夎鋒眰 鎵浠Java紼嬪簭閫氬父浼氶氳繃寰鐜 涓嶆柇鍦拌皟鐢⊿erverSocket鐨刟ccept錛堬級鏂規硶 濡備笅浠g爜鐗囨墊墍紺
銆銆//鍒涘緩涓涓猄erverSocket 鐢ㄤ簬鐩戝惉瀹㈡埛絝瘲ocket鐨勮繛鎺ヨ鋒眰
銆銆ServerSocket ss = new ServerSocket錛 錛
銆銆//閲囩敤寰鐜涓嶆柇鎺ュ彈鏉ヨ嚜瀹㈡埛絝鐨勮鋒眰
銆銆while 錛坱rue錛
銆銆{
銆銆//姣忓綋鎺ュ彈鍒板㈡埛絝瘲ocket鐨勮鋒眰 鏈嶅姟鍣ㄧ涔熷瑰簲浜х敓涓涓猄ocket
銆銆Socket s = ss accept錛堬級
銆銆//涓嬮潰灝卞彲浠ヤ嬌鐢⊿ocket榪涜岄氫俊浜
銆銆鈥
銆銆}
銆銆涓婇潰紼嬪簭涓鍒涘緩ServerSocket娌℃湁鎸囧畾IP鍦板潃 鍒欒ServerSocket灝嗕細緇戝畾鍒版湰鏈洪粯璁ょ殑IP鍦板潃 紼嬪簭涓浣跨敤 浣滀負璇ServerSocket鐨勭鍙e彿 閫氬父鎺ㄨ崘浣跨敤 浠ヤ笂鐨勭鍙 涓昏佹槸涓轟簡閬垮厤涓庡叾浠栧簲鐢ㄧ▼搴忕殑閫氱敤絝鍙e啿紿
榪斿洖鐩褰 鐤鐙侸ava璁蹭箟
緙栬緫鎺ㄨ崘
Java紼嬪簭鎬ц兘浼樺寲 璁╀綘鐨凧ava紼嬪簭鏇村揩 鏇寸ǔ瀹
鏂版墜瀛Java 緙栫▼
lishixin/Article/program/Java/hx/201311/27266
『伍』 求大佬指點 JAVA中TCP/IP服務端收到的數據怎麼存到資料庫中
無論是哪種語言,TCP的數據都是兩種,一種是未解析過的原始報文(十六進制),這種可以存資料庫,也可以是日誌形式存在日誌文件中,當做備份,調試查找問題的時候也可以通過這些原始報文來檢查問題所在。另一種就是這些原始報文經過解析後的結果,比如ID、時間、其它數據這些,解析出來後直接插入你預先創建的資料庫就可以了,這個就是歷史庫,當然一般來說,如果你的數據是以不同的設備ID區分的,通常還有一個最新狀態庫,它跟歷史庫結構一樣,但同一個設備ID只有最新的一條記錄。