java tcp ip网络编程(二) 套接字的基本使用
##基本套接字的使用
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网络编程(二) 套接字的基本使用的更多相关文章
- TCP/IP网络编程之套接字的多种可选项
套接字可选项进而I/O缓冲大小 我们进行套接字编程时往往只关注数据通信,而忽略了套接字具有的不同特性.但是,理解这些特性并根据实际需要进行更改也十分重要.之前我们写的程序在创建好套接字后都是未经特别操 ...
- TCP/IP网络编程之套接字类型与协议设置
套接字与协议 如果相隔很远的两人要进行通话,必须先决定对话方式.如果一方使用电话,另一方也必须使用电话,而不是书信.可以说,电话就是两人对话的协议.协议是对话中使用的通信规则,扩展到计算机领域可整理为 ...
- TCP/IP网络编程之套接字与标准I/O
标准I/O函数 标准标准I/O函数有两个优点: 标准I/O函数具有良好的移植性 标准I/O函数可以利用缓冲提高性能 关于移植性无需过多解释,不仅是I/O函数,所有标准函数都具有良好的移植性.因为,为了 ...
- java学习笔记 --- 网络编程(套接字)
1.Socket通信原理 Socket套接字概述: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. 通信的两端都有Socket. 网络通信其实就是Socket间的通信 ...
- TCP/IP网络编程之多播与广播
多播 多播方式的数据传输是基于UDP完成的,因此,与UDP服务端/客户端的实现非常接近.区别在于,UDP数据传输以单一目标进行,而多播数据同时传递到加入(注册)特定组的大量主机.换言之,采用多播方式时 ...
- TCP/IP网络编程之多进程服务端(二)
信号处理 本章接上一章TCP/IP网络编程之多进程服务端(一),在上一章中,我们介绍了进程的创建和销毁,以及如何销毁僵尸进程.前面我们讲过,waitpid是非阻塞等待子进程销毁的函数,但有一个不好的缺 ...
- TCP/IP网络编程系列之二(初级)
套接字类型与协议设置 我们先了解一下创建套接字的那个函数 int socket(int domain,int type,int protocol);成功时返回文件描述符,失败时返回-1.其中,doma ...
- TCP/IP网络编程之多线程服务端的实现(二)
线程存在的问题和临界区 上一章TCP/IP网络编程之多线程服务端的实现(一)的thread4.c中,我们发现多线程对同一变量进行加减,最后的结果居然不是我们预料之内的.其实,如果多执行几次程序,会发现 ...
- TCP/IP网络编程之优于select的epoll(二)
基于epoll的回声服务端 在TCP/IP网络编程之优于select的epoll(一)这一章中,我们介绍了epoll的相关函数,接下来给出基于epoll的回声服务端示例. echo_epollserv ...
随机推荐
- springCloud 服务注册启动报错<com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect>
报错:com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: ...
- this 指向详细解析(箭头函数)
前言 this 指向问题是入坑前端必须了解知识点,现在迎来了ES6时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,遂有此文 在非箭头函数下, this 指向调用其所在函数的对象,而 ...
- Linux修改hostname与免密码登录
修改hostname [root@centos7 ~]$ hostnamectl set-hostname hadoop001 # 使用这个命令会立即生效且重启也生效 [root@centos7 ~] ...
- Python:笔记2
[文件操作] 1.fileopen = open(file).readlines() //type是list 2.filewrite = open(file,'w') filewrite ...
- 灰熊:在这6个信息流和DSP平台投放后,我总结了这些血泪经验!
笔者有幸参与公司的一款重度游戏的推广,推广以来市面上主流的信息流和DSP 平台都投过一番,今天就零零碎碎地讲讲各个平台的特点以及用户质量. 需要提前说明的是,文章的观点仅限于各个平台的 iOS 流量, ...
- Spring Boot实现文件下载功能
我们只需要创建一个控制器(Controler)文件,即Controller目录下的File_Download.java,其完整目录如下: @Controller public class File_D ...
- ubuntu装bochs的常见问题
1.Message: dlopen failed for module ‘x’: file not found 原因 未安装bochs-x的缘故 解决办法 sudo apt-get install b ...
- Spring-表达式语言
概念及作用 Spring表达式语言全称为“Spring Expression Language”,缩写为“SPEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式.存取对 ...
- 容器部署解决方案Docker
容器部署解决方案Docker 课程目标 目标1:了解Docker与虚拟机的不同点,相比的优势 目标2:掌握Docker的启动方法 目标3:掌握Docker镜像操作 目标4:掌握Docker容器操作 ...
- 操作 实例 / dom
响应式:数据改变时会触发其他联动.例如:模板中的数据绑定:计算属性的重新计算: ---------------------------------------------------- vm.$par ...