下面介紹的內容僅適用于TCP(傳輸控制協議)網絡協議。java平臺另外還支持所謂的UDP(用戶數據報協議)協議,該協議可以用于發送數據包(也稱為數據報),它所需付出的開銷要比TCP少得多。UDP有一個重要的缺點:數據包無需按照順序進行傳遞,它們甚至可能在傳輸過程中全部丟失。UDP要求數據包的接受者對它們進行排序,并請求發送者重新發送那些丟失的數據包。UDP比較適合于那些可以忍受數據包丟失的應用,例如用于音頻流和視頻流的傳輸,或者用于連續測量的應用領域。
SocketSocket(String host, int port)構建一個套接字,用來連接給定的主機和端口。InputStream getInputStream()OutputStream getOutputStream()獲取可以從套接字中讀取數據的流,以及可以向套接字寫出數據的流。套接字超時從套接字讀取信息時,在可以訪問數據之前,讀操作將會被阻塞。如果此時主機不可達,那么應用將要等待很長的時間,并且因為受底層操作系統的限制而最終會導致超時。對于不同的應用,應該確定合理的超時值。然后調用setSoTimeout方法設置這個超時值(單位:毫秒)。如果已經為套接字設置了超時值,并且之后的讀操作和寫操作在沒有完成之前就超過了時間限制,那么這些操作就會拋出SocketTimeoutException異常。Socket(String host,int port)會一直無限期地阻塞下去,直到建立了到達主機的初始連接為止。
Socket a = new Socket();a.connect(new InetSocketAddress("",80), 10);這樣就解決了前面一直阻塞的問題Socket()創建一個還未被連接的套接字。void connect(SocketAddress address) 將該套接字連接到給定的地址。void connect(SocketAddress address, int timeoutInMilliseconds) 將套接字連接到給定的地址。如果在給定的時間內沒有響應,則返回。void setSoTimeout(int timeoutInMilliseconds) 設置該套接字上讀請求的阻塞時間。如果超出給定時間,則拋出一個InterruptedIOException異常。boolean isConnected() 如果該套接字已被連接,則返回true。boolean isClosed() 如果套接字已經被關閉,則返回true。因特網地址因特網地址是指用一串數字表示的主機地址,它由4個字節組成, ipv6規定為16個字節,比如132.163.4.102。通常,不用過多考慮因特網地址的問題。但是,如果需要在主機名和因特網地址之間進行轉換時,可以使用InetAddress類。靜態的getByName方法可以返回代表某個主機的InetAddress對象。
InetAddress ia = InetAddress.getByName("localhost");然后,可以使用getAddress方法來訪問這些字節。System.out.PRintln(ia.getHostName());byte[] b = ia.getAddress();可以通過調用getAllByName方法來獲得所有主機InetAddress[] ia = InetAddress.getAllByName("localhost");可以使用靜態的getLocalHost方法來得到本地主機的地址InetAddress a =InetAddress.getLocalHost();static InetAddress getByName(String host)static InetAddress[] getAllByName(String host)為給定的主機名,創建一個InetAddress對象,或者一個包含了該主機名所對應的所有因特網地址的數組。static InetAddress getLocalHost()為本地主機創建一個InetAddress對象。byte[] getAddress()返回一個包含數字型地址的字節數組。String getHostAddress()返回一個由十進制數組成的字符串,各數字間用圓點符號隔開,例如, “132.163.4.102”。String getHostName()返回主機名實現服務器使用ServerSocket類用于建立一個套接字。
ServerSocket ss = new ServerSocket(int port);Socket s = ss.accept();然后創建輸入輸出流讀取內容。ServerSocket(int port)創建一個監控端口的服務器套接字。Socket accept()等待連接。該方法阻塞(即,使之空閑)當前線程直到建立連接為止。該方法返回一個套接字對象,程序可以通過這個對象與連接中的客戶端進行通信。void close()關閉服務器套接字。客戶端public static void main(String[] args) throws UnknownHostException, IOException { Socket a = new Socket("127.0.0.1",8189); InputStream is = a.getInputStream(); OutputStream os = a.getOutputStream(); PrintWriter pw = new PrintWriter(os); BufferedReader bf = new BufferedReader(new InputStreamReader(is)); Scanner scanner = new Scanner(System.in); String s; while((s=bf.readLine())!=null){ System.out.println(s); pw.println(scanner.nextLine()); pw.flush(); }服務器ServerSocket ss = new ServerSocket(8189); Socket s = ss.accept(); InputStream is = s.getInputStream(); OutputStream os = s.getOutputStream(); PrintWriter pw = new PrintWriter(os); BufferedReader bf = new BufferedReader(new InputStreamReader(is)); pw.println("hello,enter bye to close"); pw.flush(); boolean flag=true; String input; while((input=bf.readLine())!=null&& flag){ pw.println(input); if(input.equals("bye")){ flag=false; } pw.flush(); } s.close();
新聞熱點
疑難解答