java 網路程式設計-java(6)
阿新 • • 發佈:2018-12-22
前言
計算機網路中學到了tcp/ip協議,重新拾起去年的java課本,學一學網路程式
正文
主要熟悉一下常用的有關網路的類,以及寫寫小程式實踐一下。
套接字
當兩個程式需要通訊時,可以使用Socket類建立套接字連線在一起。套接字包含了IP地址和埠號。埠號是0~65535之間的一個整數,0~1023被預先定義的服務通訊佔用,所以要選用1024~65535之間的整數。
客戶端Socket
- 帶引數構造方法
Socket mySocket = new Socket(String host, int port);
獲得socket物件後,可以使用getInputStream()
getOutputStream()
獲得輸入流,輸出流用來寫,讀資料。
- 不帶引數構造方法
Socket mySocket = new Socket();
通過connect(ScoketAddress socketAddress)
連線。可以使用ScoketAddress
子類InetSocketAddress
物件。InetSocketAddress
構造方法為
InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress inetAddress,int port)
使用者端ServerSocket
通過ServerSocket物件可以獲得一個Socket物件,用於連線客戶端。其構造方法為:
ServerSocket serverForClicent = new ServerSocket(int port);
通過accept()
獲得Socket物件。
編寫一個例子:
Client.java
package javanet; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; public class Client { public static void main(String args[]) { String[] mess = {"1+1在什麼情況下等於2", "狗為什麼不生跳蚤", "什麼東西能吃能看能做"}; Socket mySocket = new Socket(); DataInputStream in = null; DataOutputStream out = null; try { InetAddress inetAddress = InetAddress.getByName("127.0.0.1"); InetSocketAddress inetSocketAddress = new InetSocketAddress(inetAddress, 2010); mySocket.connect(inetSocketAddress); in = new DataInputStream(mySocket.getInputStream()); out = new DataOutputStream(mySocket.getOutputStream()); for (int i=0;i<mess.length;i++) { out.writeUTF(mess[i]); String s = in.readUTF(); System.out.println("客戶收到伺服器回答: "+s); Thread.sleep(5000); } } catch (Exception e) { e.printStackTrace(); } } }
Server.java
package javanet;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String args[]) {
String[] answer = {"在算錯的情況下", "狗就能生狗", "電視麵包沙發"};
ServerSocket serverForClicent = null;
Socket socketOnServer = null;
DataOutputStream out = null;
DataInputStream in = null;
try {
serverForClicent = new ServerSocket(2010);
socketOnServer = serverForClicent.accept();
in = new DataInputStream(socketOnServer.getInputStream());
out = new DataOutputStream(socketOnServer.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
for (int i=0;i<answer.length;i++) {
if (socketOnServer!=null) {
try {
System.out.println("伺服器收到客戶問題: "+in.readUTF());
out.writeUTF(answer[i]);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
UDP資料報
套接字是基於socket的網路通訊,是有連線的。通過connect()
和accept()
連線,通過流來傳輸資料。UDP資料傳輸更快,但是無法確定資料是否到達目的主機,不提供可靠性保證。
UDP通訊基本模式為:
- 資料打包,傳送資料包
- 接收資料包並檢視
傳送資料包
用DatagramPacket
類將資料打包成資料包,DatagramSocket
類傳送資料包
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
DatagramPacket datagramPacket = new DatagramPacket(data, data.length, inetAddress, 2009);
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.send(datagramPacket);
接收資料包
DatagramSocket
類接收資料包後並封裝在DatagramPacket
物件中
DatagramSocket datagramSocket = new DatagramSocket(2009);
DatagramPacket datagramPacket = new DatagramPacket(data, len);
datagramSocket.receive(datagramPacket);
具體寫一個例子
Myhost.java
傳送資料包
package udptest;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Myhost {
public static void main(String args[]) {
byte[] data = "今天是週日".getBytes();
try {
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
DatagramPacket datagramPacket = new DatagramPacket(data, data.length, inetAddress, 2009);
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.send(datagramPacket);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Youhost.java
接收資料包
package udptest;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Youhost {
public static void main(String args[]) {
byte[] data = new byte[100];
int len = 90;
try {
DatagramSocket datagramSocket = new DatagramSocket(2009);
DatagramPacket datagramPacket = new DatagramPacket(data, len);
datagramSocket.receive(datagramPacket);
String me = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
System.out.println(me);
System.out.println(datagramPacket.getAddress());
System.out.println(datagramPacket.getPort());
System.out.println(datagramPacket.getSocketAddress());
} catch (Exception e) {
e.printStackTrace();
}
}
}