A. java Socket甯歌佸紓甯稿勭悊
銆銆鍦╦ava緗戠粶緙栫▼Socket閫氫俊涓 閫氬父浼氶亣鍒頒互涓嬪紓甯告儏鍐
銆銆絎 涓寮傚父鏄 BindException:Address already in use: JVM_Bind
銆銆璇ュ紓甯稿彂鐢熷湪鏈嶅姟鍣ㄧ榪涜宯ew ServerSocket(port)錛坧ort鏄涓涓 鐨勬暣鍨嬪礆級鎿嶄綔鏃 寮傚父鐨勫師鍥犳槸浠ヤ負涓巔ort涓鏍風殑涓涓絝鍙e凡緇忚鍚鍔 騫惰繘琛岀洃鍚 姝ゆ椂鐢╪etstat an鍛戒護 鍙浠ョ湅鍒頒竴涓狶istending鐘舵佺殑絝鍙 鍙闇瑕佹壘涓涓娌℃湁琚鍗犵敤鐨勭鍙e氨鑳借В鍐寵ラ棶棰樹簡
銆銆絎 涓寮傚父鏄 ConnectException: Connection refused: connect
銆銆璇ュ紓甯稿彂鐢熷湪瀹㈡埛絝榪涜 new Socket(ip port)鎿嶄綔鏃 璇ュ紓甯稿彂鐢熺殑鍘熷洜鏄鎴栬呭叿鏈塱p鍦板潃鐨勬満鍣ㄤ笉鑳芥壘鍒幫紙涔熷氨鏄璇翠粠褰撳墠鏈哄櫒涓嶅瓨鍦ㄥ埌鎸囧畾ip璺鐢憋級 鎴栬呮槸璇ip瀛樺湪 浣嗘壘涓嶅埌鎸囧畾鐨勭鍙h繘琛岀洃鍚 鍑虹幇璇ラ棶棰 棣栧厛媯鏌ュ㈡埛絝鐨剗p鍜宲ort鏄鍚﹀啓閿 濡傛灉姝g『鍒欎粠瀹㈡埛絝痯ing涓涓嬫湇鍔″櫒鐪嬫槸鍚﹁兘ping閫 濡傛灉鑳絧ing閫氾紙鏈嶅姟鍣ㄧ鎶妏ing紱佹帀鍒欓渶瑕佸彟澶栫殑鍔炴硶錛 鍒欑湅鍦ㄦ湇鍔″櫒絝鐨勭洃鍚鎸囧畾絝鍙g殑紼嬪簭鏄鍚﹀惎鍔 榪欎釜鑲瀹氳兘瑙e喅榪欎釜闂棰
銆銆絎 涓寮傚父鏄 SocketException: Socket is closed
銆銆璇ュ紓甯稿湪瀹㈡埛絝鍜屾湇鍔″櫒鍧囧彲鑳藉彂鐢 寮傚父鐨勫師鍥犳槸鏈絝涓誨姩鍏抽棴浜嗚繛鎺ュ悗錛堣皟鐢ㄤ簡Socket鐨刢lose鏂規硶錛夊啀瀵圭綉緇滆繛鎺ヨ繘琛岃誨啓鎿嶄綔
銆銆絎 涓寮傚父鏄 SocketException: 錛圕onnection reset鎴栬匔onnect reset by peer:Socket write error錛
銆銆璇ュ紓甯稿湪瀹㈡埛絝鍜屾湇鍔″櫒絝鍧囨湁鍙鑳藉彂鐢 寮曡搗璇ュ紓甯哥殑鍘熷洜鏈変袱涓 絎涓涓灝辨槸濡傛灉涓絝鐨凷ocket琚鍏抽棴錛堟垨涓誨姩鍏抽棴鎴栬呭洜涓哄紓甯擱鍑鴻屽紩璧風殑鍏抽棴錛 鍙︿竴絝浠嶅彂閫佹暟鎹 鍙戦佺殑絎涓涓鏁版嵁鍖呭紩鍙戣ュ紓甯(Connect reset by peer) 鍙︿竴涓鏄涓絝閫鍑 浣嗛鍑烘椂騫舵湭鍏抽棴璇ヨ繛鎺 鍙︿竴絝濡傛灉鍦ㄤ粠榪炴帴涓璇繪暟鎹鍒欐姏鍑鴻ュ紓甯革紙Connection reset錛 綆鍗曠殑璇村氨鏄鐢辮繛鎺ユ柇寮鍚庣殑璇誨拰鍐欐搷浣滃紩璧風殑
銆銆絎 涓寮傚父鏄 SocketException: Broken pipe
銆銆璇ュ紓甯稿湪瀹㈡埛絝鍜屾湇鍔″櫒鍧囨湁鍙鑳藉彂鐢 鍦ㄧ 涓寮傚父鐨勭涓縐嶆儏鍐典腑錛堜篃灝辨槸鎶涘嚭 SocketExcepton:Connect reset by peer:Socket write error鍚庯級 濡傛灉鍐嶇戶緇鍐欐暟鎹鍒欐姏鍑鴻ュ紓甯 鍓嶄袱涓寮傚父鐨勮В鍐蟲柟娉曟槸棣栧厛紜淇濈▼搴忛鍑哄墠鍏抽棴鎵鏈夌殑緗戠粶榪炴帴 鍏舵℃槸瑕佹嫻嬪規柟鐨勫叧闂榪炴帴鎿嶄綔 鍙戠幇瀵規柟鍏抽棴榪炴帴鍚庤嚜宸變篃瑕佸叧闂璇ヨ繛鎺
銆銆浜岋紟緙栧啓緗戠粶紼嬪簭鏃墮渶瑕佹敞鎰忕殑闂棰:
銆銆 鏄瑕佹g『鍖哄垎闀 鐭榪炴帴 鎵璋撶殑闀胯繛鎺ユ槸鎸囦竴緇忓緩絝嬪氨姘鎬箙淇濇寔 鐭榪炴帴鐨勬儏鍐墊槸 鍑嗗囨暟鎹鈥>寤虹珛榪炴帴鈥>鍙戦佹暟鎹鈥>鍏抽棴榪炴帴 寰堝氱殑紼嬪簭鍛樺啓浜嗗氬勾鐨勭綉緇滅▼搴 灞呯劧涓嶇煡閬撲粈涔堟槸闀胯繛鎺 浠涔堟槸鐭榪炴帴
銆銆 鏄瀵歸暱榪炴帴鐨勭淮鎶 鎵璋撶淮鎶ゅ寘鎷涓や釜鏂歸潰 棣栧厛鏄媯嫻嬪規柟鐨勪富鍔ㄦ柇榪烇紙鍗寵皟鐢 Socket鐨刢lose鏂規硶錛 鍏舵℃槸媯嫻嬪規柟鐨勫畷鏈 寮傚父閫鍑哄強緗戠粶涓嶉 榪欐槸涓涓鍋ュ.鐨勯氫俊紼嬪簭蹇呴』鍏峰囩殑 媯嫻嬪規柟鐨勪富鍔ㄦ柇榪炲緢綆鍗 涓昏佷竴鏂逛富鍔ㄦ柇榪 鍙︿竴鏂瑰傛灉鍦ㄨ繘琛岃繪搷浣 鍒欐ゆ椂鐨勮繑鍥炲煎彧 涓鏃︽嫻嬪埌瀵規柟鏂榪 鍒欏簲璇ヤ富鍔ㄥ叧闂鏈絝鐨勮繛鎺ワ紙璋冪敤Socket鐨刢lose鏂規硶錛 鑰屾嫻嬪規柟鐨勫畷鏈 寮傚父閫鍑哄強緗戠粶涓嶉 甯哥敤鏂規硶鏄鐢 蹇冭煩 涔熷氨鏄鍙屾柟鍛ㄦ湡鎬х殑鍙戦佹暟鎹緇欏規柟 鍚屾椂涔熶粠瀵規柟鎺ユ敹 蹇冭煩 濡傛灉榪炵畫鍑犱釜鍛ㄦ湡閮芥病鏈夋敹鍒板規柟蹇冭煩 鍒欏彲浠ュ垽鏂瀵規柟瀹曟満 寮傚父閫鍑烘垨鑰呯綉緇滀笉閫 姝ゆ椂涔熼渶瑕佷富鍔ㄥ叧闂鏈絝榪炴帴 濡傛灉鏄瀹㈡埛絝鍙鍦ㄥ歡榪熶竴瀹氭椂闂村悗閲嶆柊鍙戣搗榪炴帴 鉶界劧Socket鏈変竴涓猭eep alive閫夐」鏉ョ淮鎶よ繛鎺 濡傛灉鐢ㄨラ夐」 涓鑸闇瑕佷袱涓灝忔椂鎵嶈兘鍙戠幇瀵規柟鐨勫畷鏈 寮傚父閫鍑哄強緗戠粶涓嶉
lishixin/Article/program/Java/hx/201311/26630
B. JAVA 問題,用socket編寫一個客戶端程序
給你一個我寫的示例,用的是基於TCP的Socket技術,你鍛煉一下,改一改,不會改再找我!
客戶端:
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class TcpClient {
public static void main(String[] args) throws Exception
{
//創建客戶端Socket服務,並且制定主機和ank
Socket s = new Socket("192.168.1.104",10002);//連接固定的主機和埠
//為了發送數據,獲取Socket中的輸入輸出流
OutputStream out = s.getOutputStream();
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String line = null;
//讀取伺服器發過來的數據
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
while((line = br.readLine())!=null)
{
out.write(line.getBytes());
if("886".equals(line))
break;
int len = in.read(buf);
String content = new String(buf,0,len);
System.out.println("Server:"+content);
}
s.close();
}
}
伺服器:
/*
* 需求分析:
* 使用TCP協議,寫伺服器端。做到伺服器能收到客戶端的信息,也能向客戶端發送信息
* */
package JavaNetProgramming;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class TcpServer {
public static void main(String[] args) throws Exception
{
//建立伺服器的Socket服務,並且監聽一個埠
ServerSocket ss = new ServerSocket(10002);
Socket s = ss.accept();
InputStream is = s.getInputStream();
//從伺服器端向客戶端發送數據
OutputStream out = s.getOutputStream();
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String line = null;
while(true)
{
//通過accept()方法獲得客戶端傳過來的Socket對象
// System.out.println("getByNanme():"+s.getInetAddress());
System.out.print("getHostAddress():"+s.getInetAddress().getHostAddress());
//獲取客戶端發過來的數據,就要使用客戶端對象的讀取流來讀取數據
byte[] buf = new byte[1024];
int len = is.read(buf);//把流中數據讀到位元組數組中
String content = new String(buf,0,len);
System.out.println(" "+content);
if("886".equals(content))
break;
while((line = br.readLine())!=null)
{
out.write(line.getBytes());
break;
}
}
s.close(); //循環內有判斷語句,這句話才不出錯
ss.close();
}
}
C. java Socket能寫瀏覽器嗎,我想用Socket寫一個瀏覽器
第一個問題:
當serversocket.accept()成功返回時(設為sSocket),就已經和客戶端發起該連接請求的
socket線程之間建立起了tcp實體連接,這個鏈接當中包涵了該請求線程使用的埠號和ip地址,當sSocket通過輸出流回送數據時,數據包里包涵了接收端的ip地址和客戶端線程對應的埠號,當在該埠號上監聽的socket監聽到數據後,對數據進行加工處理(如瀏覽器顯示)。
第二個問題:
單個瀏覽器窗口或者選項卡對應一個進程,每個進程發起tcp或者http請求時,將綁定到一個指定埠(如12340,23450等等),並在自己綁定的
埠上設置監聽,當數據到來時是路由器將數據發送到指定內網ip地址,到達客戶機之後根據數據包的埠信息,將數據發送到對應的埠,此時哪個進程的監聽
埠聽到了數據,就是哪個瀏覽器窗口或者選項卡顯示。其他的窗口不監聽該埠的,沒有任何動作。
瀏覽器不管每次返回的資源是哪次的請求,發起請求的瀏覽器進程自動監聽建立tcp連接時使用埠號,回送的數據包里包涵了埠號,所以操作系統知道該將數據發送到哪個埠。
就是說埠號是和內存中的應用程序綁定的。
這么說吧,所有的TCP/http請求都是在客戶機綁定到某個埠後建立起來的,也就是說客戶端的程序(如瀏覽器或者一般的java程序)在向伺服器發送請求成功後就在客戶機的那個埠設立了監聽,比如瀏覽器發送請求時使用3333號埠,那麼瀏覽器就在3333號埠等待數據的返回,接受完數據後,就繪制出來給用戶使用。又比如一般java程序發送的socket請求使用了4444號埠,那麼客戶端socket就在4444號埠等數據,數據到來並接收完後就進行數據處理,如xml可以用在監聽到數據流後構建一顆xml,dom樹然後進行解析或者存入文件。
假如100線程都在同一個進程內,那麼每個線程和server建立socket連接時都會使用一個自己獨占的埠號,然後就等待數據返回到自己綁定的埠,100線程就會有100個埠號,操作系統接收到網路數據後將數據解包,找出是發向哪個埠的數據,然後轉發過去,這時候肯定有個線程收到了數據,收到後想幹嘛就是這個線程自己的事,跟其他線程無關啊
D. java中如何檢測本機指定的UDP服務埠是否被佔用並且自動分配一個可用udp埠;
1.埠佔用編譯器會報錯,可以從錯誤看出來是不是埠被佔用。沒有專門的檢測工具和方法
2.DatagramSocket(在Java中使用UDP協議編程的相關類)
用於接收和發送UDP的Socket實例。該類有3個構造函數:
DatagramSocket():通常用於客戶端編程,它並沒有特定監聽的埠,僅僅使用一個臨時的。程序會讓操作系統分配一個可用的埠。
DatagramSocket(int port):創建實例,並固定監聽Port埠的報文。通常用於服務端
DatagramSocket(int port, InetAddress localAddr):這是個非常有用的構建器,當一台機器擁有多於一個IP地址的時候,由它創建的實例僅僅接收來自LocalAddr的報文。
DatagramSocket具有的主要方法如下:
1)receive(DatagramPacket d):接收數據報文到d中。receive方法產生一個「阻塞」。「阻塞」是一個專業名詞,它會產生一個內部循環,使程序暫停在這個地方,直到一個條件觸發。
2)send(DatagramPacket dp):發送報文dp到目的地。
3)setSoTimeout(int timeout):設置超時時間,單位為毫秒。
4)close():關閉DatagramSocket。在應用程序退出的時候,通常會主動釋放資源,關閉Socket,但是由於異常地退出可能造成資源無法回收。所以,應該在程序完成時,主動使用此方法關閉Socket,或在捕獲到異常拋出後關閉Socket。
希望對您有幫助謝謝