1. 程式人生 > >java tcp ip網絡編程(二) 套接字的基本使用

java tcp ip網絡編程(二) 套接字的基本使用

數據 all while 功能 傳輸過程 true 地址 right 客戶

##基本套接字的使用


linux系統把網絡io抽象成socket,對網絡的編程就是對socket的編程。


java把套接字抽象成類似的類

InetAddress SocketAddress 識別java應用程序如何識別網絡主機
客戶端Socket類 ServerSocket類
UDP類 DatagramSocket

獲取用戶的網卡和對應的ip信息

通過host獲取對應的網絡地址
```
Enumeration<NetworkInterface> networkInterfaceEnumeration =
NetworkInterface.getNetworkInterfaces();

if(networkInterfaceEnumeration == null){
System.out.println("no interfacle");
}else{
while (networkInterfaceEnumeration.hasMoreElements()){
NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement();
Enumeration<InetAddress> address = networkInterface.getInetAddresses();
if(!address.hasMoreElements()){
System.out.println("it is not address");
}
System.out.println("networkInterface:"+networkInterface.getName());
while (address.hasMoreElements()){
InetAddress address1 = address.nextElement();
System.out.println(
address1 instanceof Inet4Address ?"ipv4":"ipv6"
);
System.out.println(address1.getHostAddress());
}
System.out.println("####");
}

}

System.out.println("host xxx"+args.length);
String[] arr = new String[1];
arr[0] = "weibo.cn";
for (String host : arr){
System.out.println(host+":");
InetAddress[] inetAddresses = InetAddress.getAllByName(host);

for(InetAddress inet: inetAddresses){
System.out.println(inet.getHostName()+":"+inet.getHostAddress());
System.out.println("toString:"+inet.toString());
System.out.println("caninical:"+inet.getCanonicalHostName());
}
}
```

java提供了TCP套接字

Socket,ServerSocket

客戶端

```
if(args.length != 3){
throw new Exception("arg lengh is not right!");
}

String host = args[0];
byte[] data = args[1].getBytes();
int port = Integer.parseInt(args[2]);

Socket socket = new Socket(host, port);
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
outputStream.write(data);
System.out.println("write data"+data);
int totalRecived = 0;
int recived;
while (totalRecived < data.length){

if((recived = inputStream.read(data,
totalRecived, data.length-totalRecived)) == -1){
throw new IllegalStateException("IllegalStateException");
}
System.out.println("totalRecived:"+totalRecived);
totalRecived += recived;
}

System.out.println("received:"+ new String(data));
socket.close();
```

服務端
```
if(args.length != 1){
throw new Exception("arg lengh is not right!");
}

ServerSocket serverSocket = new ServerSocket(
Integer.parseInt(args[0]));

int temp = 0;
byte[] data = new byte[buffer];
while (true){

Socket socket = serverSocket.accept();
SocketAddress socketAddress = socket.getRemoteSocketAddress();
System.out.println("client address"+socketAddress.toString());
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
while ((temp = in.read(data)) != -1){
out.write(data,0, temp);
}
socket.close();
}

```

udp協議的主要功能

1 在ip地址上增加了端口
2 對傳輸過程中可能產生的數據錯誤進行了檢測,並拋棄了已經損壞的數據

udp的特定

1 設置消息邊界
2 應用程序必須處理丟失和重排功能

java提供的UDP套接字

DatagramSocket
DatagramPacket

服務端
```
DatagramSocket datagramSocket = new DatagramSocket(port);

DatagramPacket packet = new DatagramPacket(new byte[MAX_LENGTH],
MAX_LENGTH);

while (true){
datagramSocket.receive(packet);
System.out.println("client "+packet.getAddress().getHostAddress()+" "+
packet.getPort());
datagramSocket.send(packet);
packet.setLength(MAX_LENGTH);
}
```

客戶端
```
InetAddress address = InetAddress.getByName(args[0]);
byte[]data = args[1].getBytes();
int port = Integer.parseInt(args[2]);
DatagramPacket sendPacket = new DatagramPacket(
data,data.length,address,port
);

DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.setSoTimeout(timeout);

DatagramPacket receive = new DatagramPacket(
new byte[data.length],data.length
);

boolean receivedResponse = false;
int tries = 0;
do{
datagramSocket.send(sendPacket);
try{
datagramSocket.receive(receive);
if(!receive.getAddress().equals(address)){
System.out.println("receive unknow host");
}
receivedResponse = true;
}catch (InterruptedIOException e){
tries++;
System.out.println("retry times :"+tries);
}

}while (tries < times && !receivedResponse);

if(receivedResponse){
System.out.println("Received:" + new String(receive.getData()));
}

datagramSocket.close();
```

java tcp ip網絡編程(二) 套接字的基本使用