Java网络基础,Socket通信基础
2017-07-31 20:17
369 查看
一、网络基础
1、InetAddress
InetAddress构造器私有,可以通过多种方式获得inetAddress对象
InetAddressip
= InetAddress.getLocalHost();//获取本机IP
ip
= InetAddress.getByName("100.64.141.89");//通过名字获取指定地址IP
String name = ip.getHostName();//通过IP获取IP名字
2、URL统一资源定位符
典型构成:1、网络协议(http://);2、主机地址(192.168.46.20/myServlet);3、端口号(80);4、资源路径(crm/index.jsp);5、查询地址(gid=117)
//构造器多种,可以采用指定URL连接构造一个URL,也可以使协议,用端口号,文件名等信息构成URL
String
str = "http://192.168.46.254:8888/easyBuy/crm/index.jsp";
URL
url = new URL(str);
[align=left]String protocol = url.getProtocol();// 获取协议[/align]
[align=left] String host = url.getHost();// 主机名[/align]
int
port = url.getPort();//端口号
对资源文件的一般操作
String file = url.getFile();//获取资源中包含的文件名称
InputStream is = url.openStream();//打开此URL连接(URLConnection),并获取连接的输入流(URLconnection.getOutputStream())
对URL地址进行转码,解码,防止乱码
String str1 = URLEncoder.encode(str, "UTF-8");//对str字符串进行UTF-8转码
[align=left]
[/align]
[align=left]String str2 = URLDecoder.decode(str1, "UTF-8");//解码[/align]
3、HttpURLConnection
继承URLConnection类;Http协议简介http是一个无状态协议,请求、响应协议由请求头和响应头构成 。
①请求头: 请求方法:get post delete put.....
②响应头 响应状态码:status code:200(正常响应) 400~(404,405请求资源异常,不存在,请求响应格式不一致)
500~(500服务器内部异常)
//利用HttpURL协议下载文件
String
str3
= "http://192.168.46.254:8888/easyBuy/images/plmm.jpg";
URLurl2
=
new URL(str3);
[align=left] // 打开一个URL连接[/align]
HttpURLConnectionconn
= (HttpURLConnection)
url2.openConnection();//获取一个连接(URLConnection)
[align=left] // 设置请求方法[/align]
[align=left] //conn.setRequestMethod("GET");[/align]
// conn.setRequestProperty("Accep-Language",
"zh-en");
// conn.setReadTimeout(10000);//
设置读取超时时间,可以默认
// conn.setDoInput(true);//
打开输入和输出,可以不设置,默认true
[align=left] //conn.setDoOutput(true);[/align]
// intcode
=
conn.getResponseCode();// 获取响应状态码
[align=left] // System.out.println(code);[/align]
[align=left] // 判断是否响应成功[/align]
if(code==
HttpURLConnection.HTTP_OK) {
InputStreamis1
=
conn.getInputStream();
FileOutputStreamfileOutputStream
=
new FileOutputStream(newFile("C:\\Users\\lx\\Desktop\\test\\mn.jpg"));
BufferedInputStreambfi
=
new BufferedInputStream(is1);
BufferedOutputStreambfo
=
new BufferedOutputStream(fileOutputStream);
[align=left] intlen;[/align]
byte[]bs
=
new byte[1024];
[align=left] while((len=bfi.read(bs))!=-1){[/align]
bfo.write(bs,
0, len);
[align=left] bfo.flush();[/align]
[align=left] }[/align]
}
二、Socket通讯:
1、TCP/IP
IP:InternetProtocol 网络协议,支撑主机之间通讯的基本协议,如果需要实现主机之间的消息安全传输,通常会结合TCP协议共同使用。全称为TCP/IP。都是传输层协议。
TCP:传输控制协议,能保证数据消息的在主机之间安全传输,三次握手,四次挥手。是一个安全传输数据协议,所以一般用于数据传输的准确性,安全性较高的应用,但是效率较低,如:视频通话。
C/S 架构: Client/Server 客户端/服务器模式
B/S 架构: Browser/Server 浏览器/服务器模式
服务器端:
1、创建serverSocket,此套接字为服务器专用,构造器应当包含端口号,以供其他主机连接。
2、监听套接字,并获得连接:Socket socket = serverSocket.accept( );
3、获取套接字输出流:socket.getOutputStream( );
ServerSocketserverSocket
=
new ServerSocket(9999);
[align=left] System.out.println("服务器开启");[/align]
while(true)
{
Socketsocket
=
serverSocket.accept();
System.out.println("客户端已经连接"+
socket.getInetAddress());
PrintStreamps
=
new PrintStream(socket.getOutputStream());
[align=left] ps.print("欢迎使用socket服务器");[/align]
[align=left] }[/align]
客户端
1、利用构造器获取以供连接的套接字,属性包含目标IP和端口号
2、获取套接字里面的输入流:socket.getInputStreeam( );
Socketsocket
=
new Socket("127.0.0.1", 9999);
InputStreamReaderisr
=
new InputStreamReader(socket.getInputStream());
BufferedReaderbr
=
new BufferedReader(isr);
Stringmsg
=
br.readLine();
System.out.println(msg);
2、UDP
UDP:user datagram Protocol 用户数据协议,无法保证数据的安全性,但是可以提交数据传输的效。
接收数据:为阻塞式,需要单独作为一个线程
1、创建网络通道datagramSocket,应当是包含端口地址的构造器
2、创建数据包datagramPacket ,其中构造方法必须包含一个空的字符缓冲区,偏移量等信息。
3、通过datagramSocket.receiver(datagramPacket);接受数据,向数据包写入数据。
4、获取数据包内容 new String(datagramPacket.getData() , datagramPacket.getOffset(),datagramPacket.getLength());
public
static void
main(String[] args)throws
IOException {
DatagramSocketdatagramSocket
=
new DatagramSocket(2345);
byte[]b
=
new byte[1024];
while(true)
{
DatagramPacketdatagramPacket
=
new DatagramPacket(b,b.length);
[align=left] datagramSocket.receive(datagramPacket);//接受数据[/align]
Stringstring
=
new String(datagramPacket.getData(),datagramPacket.getOffset(),
[align=left] datagramPacket.getLength()); [/align]
System.out.println("接受到的数据是"+
string);
[align=left] }[/align]
}
发送数据:
1、创建网络通道datagramSocket,构造器不需写入
2、创建数据包 datagramPacket,构造方法里面包含需要写入的字节数组,偏移量,目标地址,目标端口号,当然也可以通过set方式设置目标地址地址等信息
3、发送数据报 datagramSocket.send(datagramPacket);
public
static void
main(String[] args)throws
IOException {
[align=left] //创建一个网络通道[/align]
DatagramSocketdatagramSocket
=
new DatagramSocket();
[align=left] //将数据打包成数据报包[/align]
[align=left] Stringmessage="nnnnnn";[/align]
[align=left] [/align]
DatagramPacketdatagramPacket
=
new DatagramPacket(
[align=left] message.getBytes(),message.getBytes().length,[/align]
[align=left] InetAddress.getByName("192.168.46.19"),[/align]
[align=left] 2345);[/align]
datagramSocket.send(datagramPacket);
[align=left] datagramSocket.close();[/align]
}
3、UDP多播广播
发送数据:
1、创建多播广播通道 new MulticastSocket( );
2、获取组播地址并将广播加入此地址 multicastSocket.jionGroup( InterAddress.getByName("266.81.9.8") );
3、构建datagramPacket,包含byte[]的内容,byte[]长度,ip,端口号。当然可以不用在构建方法添加ip和端口号。
4、发送消息:multicastSocket.send(datagramPacket);
publicstatic
void
main(String[] args)
throws
IOException {
MulticastSocketmulticastSocket
=
new MulticastSocket();
InetAddressgroup
= InetAddress.getByName("226.81.9.8");
[align=left] multicastSocket.joinGroup(group);[/align]
Stringcontent
=
"刷屏100遍";
[align=left] [/align]
DatagramPacketdp
=
new DatagramPacket(content.getBytes(),content.getBytes().length);
[align=left] dp.setAddress(group);[/align]
[align=left] dp.setPort(2426);[/align]
[align=left] [/align]
[align=left] multicastSocket.send(dp);[/align]
}
接收数据:阻塞式,需要单独作为一个线程
1、创建多播广播通道:new MuliticastSocket(2426); 构造方法应当包含开启的端口号
2、获取广播地址,并加入此广播地址 muliticast.jionGroup(InterAddress.getByName("192.22.22.2"));
3、创建你个空的btye[]数组。和一个datdagramPacke对象。包含btye[]相关信息
4、接收数据:mutilicastSocket.receive(datagramPacket);
5、读取datagramPacket内容:利用String的构造方法
publicstatic
void
main(String[] args)
throws
IOException {
MulticastSocketms=new
MulticastSocket(2426);
InetAddressgroup
= InetAddress.getByName("226.81.9.8");
[align=left] ms.joinGroup(group);[/align]
byte[]b
=
new byte[1024];
while (true) {
DatagramPacketdatagramPacket
=
new DatagramPacket(b,b.length);
[align=left] ms.receive(datagramPacket);//接受数据[/align]
Stringstring
=
new String(datagramPacket.getData(),datagramPacket.getOffset(),
[align=left] datagramPacket.getLength()); [/align]
System.out.println(datagramPacket.getAddress()+""+
string);
[align=left] }[/align]
4、NIO
NIO是jdk1.4之后引入的一套全新的IO API,处理数据的方式不同于传统IO,传统IO的处理数据的方式以字节为单位,而NIO是一个Buffer(数据块) 为单位,传统IO属于阻塞式(流在读取数据时如果未读到时,程序会处于阻塞状态);而NIO的处理的方式为非阻塞式方式允许(底层为信号通讯),NIO可以在单线程应用中处理多个客户请求。
1、InetAddress
InetAddress构造器私有,可以通过多种方式获得inetAddress对象
InetAddressip
= InetAddress.getLocalHost();//获取本机IP
ip
= InetAddress.getByName("100.64.141.89");//通过名字获取指定地址IP
String name = ip.getHostName();//通过IP获取IP名字
2、URL统一资源定位符
典型构成:1、网络协议(http://);2、主机地址(192.168.46.20/myServlet);3、端口号(80);4、资源路径(crm/index.jsp);5、查询地址(gid=117)
//构造器多种,可以采用指定URL连接构造一个URL,也可以使协议,用端口号,文件名等信息构成URL
String
str = "http://192.168.46.254:8888/easyBuy/crm/index.jsp";
URL
url = new URL(str);
[align=left]String protocol = url.getProtocol();// 获取协议[/align]
[align=left] String host = url.getHost();// 主机名[/align]
int
port = url.getPort();//端口号
对资源文件的一般操作
String file = url.getFile();//获取资源中包含的文件名称
InputStream is = url.openStream();//打开此URL连接(URLConnection),并获取连接的输入流(URLconnection.getOutputStream())
对URL地址进行转码,解码,防止乱码
String str1 = URLEncoder.encode(str, "UTF-8");//对str字符串进行UTF-8转码
[align=left]
[/align]
[align=left]String str2 = URLDecoder.decode(str1, "UTF-8");//解码[/align]
3、HttpURLConnection
继承URLConnection类;Http协议简介http是一个无状态协议,请求、响应协议由请求头和响应头构成 。
①请求头: 请求方法:get post delete put.....
②响应头 响应状态码:status code:200(正常响应) 400~(404,405请求资源异常,不存在,请求响应格式不一致)
500~(500服务器内部异常)
//利用HttpURL协议下载文件
String
str3
= "http://192.168.46.254:8888/easyBuy/images/plmm.jpg";
URLurl2
=
new URL(str3);
[align=left] // 打开一个URL连接[/align]
HttpURLConnectionconn
= (HttpURLConnection)
url2.openConnection();//获取一个连接(URLConnection)
[align=left] // 设置请求方法[/align]
[align=left] //conn.setRequestMethod("GET");[/align]
// conn.setRequestProperty("Accep-Language",
"zh-en");
// conn.setReadTimeout(10000);//
设置读取超时时间,可以默认
// conn.setDoInput(true);//
打开输入和输出,可以不设置,默认true
[align=left] //conn.setDoOutput(true);[/align]
// intcode
=
conn.getResponseCode();// 获取响应状态码
[align=left] // System.out.println(code);[/align]
[align=left] // 判断是否响应成功[/align]
if(code==
HttpURLConnection.HTTP_OK) {
InputStreamis1
=
conn.getInputStream();
FileOutputStreamfileOutputStream
=
new FileOutputStream(newFile("C:\\Users\\lx\\Desktop\\test\\mn.jpg"));
BufferedInputStreambfi
=
new BufferedInputStream(is1);
BufferedOutputStreambfo
=
new BufferedOutputStream(fileOutputStream);
[align=left] intlen;[/align]
byte[]bs
=
new byte[1024];
[align=left] while((len=bfi.read(bs))!=-1){[/align]
bfo.write(bs,
0, len);
[align=left] bfo.flush();[/align]
[align=left] }[/align]
}
二、Socket通讯:
1、TCP/IP
IP:InternetProtocol 网络协议,支撑主机之间通讯的基本协议,如果需要实现主机之间的消息安全传输,通常会结合TCP协议共同使用。全称为TCP/IP。都是传输层协议。
TCP:传输控制协议,能保证数据消息的在主机之间安全传输,三次握手,四次挥手。是一个安全传输数据协议,所以一般用于数据传输的准确性,安全性较高的应用,但是效率较低,如:视频通话。
C/S 架构: Client/Server 客户端/服务器模式
B/S 架构: Browser/Server 浏览器/服务器模式
服务器端:
1、创建serverSocket,此套接字为服务器专用,构造器应当包含端口号,以供其他主机连接。
2、监听套接字,并获得连接:Socket socket = serverSocket.accept( );
3、获取套接字输出流:socket.getOutputStream( );
ServerSocketserverSocket
=
new ServerSocket(9999);
[align=left] System.out.println("服务器开启");[/align]
while(true)
{
Socketsocket
=
serverSocket.accept();
System.out.println("客户端已经连接"+
socket.getInetAddress());
PrintStreamps
=
new PrintStream(socket.getOutputStream());
[align=left] ps.print("欢迎使用socket服务器");[/align]
[align=left] }[/align]
客户端
1、利用构造器获取以供连接的套接字,属性包含目标IP和端口号
2、获取套接字里面的输入流:socket.getInputStreeam( );
Socketsocket
=
new Socket("127.0.0.1", 9999);
InputStreamReaderisr
=
new InputStreamReader(socket.getInputStream());
BufferedReaderbr
=
new BufferedReader(isr);
Stringmsg
=
br.readLine();
System.out.println(msg);
2、UDP
UDP:user datagram Protocol 用户数据协议,无法保证数据的安全性,但是可以提交数据传输的效。
接收数据:为阻塞式,需要单独作为一个线程
1、创建网络通道datagramSocket,应当是包含端口地址的构造器
2、创建数据包datagramPacket ,其中构造方法必须包含一个空的字符缓冲区,偏移量等信息。
3、通过datagramSocket.receiver(datagramPacket);接受数据,向数据包写入数据。
4、获取数据包内容 new String(datagramPacket.getData() , datagramPacket.getOffset(),datagramPacket.getLength());
public
static void
main(String[] args)throws
IOException {
DatagramSocketdatagramSocket
=
new DatagramSocket(2345);
byte[]b
=
new byte[1024];
while(true)
{
DatagramPacketdatagramPacket
=
new DatagramPacket(b,b.length);
[align=left] datagramSocket.receive(datagramPacket);//接受数据[/align]
Stringstring
=
new String(datagramPacket.getData(),datagramPacket.getOffset(),
[align=left] datagramPacket.getLength()); [/align]
System.out.println("接受到的数据是"+
string);
[align=left] }[/align]
}
发送数据:
1、创建网络通道datagramSocket,构造器不需写入
2、创建数据包 datagramPacket,构造方法里面包含需要写入的字节数组,偏移量,目标地址,目标端口号,当然也可以通过set方式设置目标地址地址等信息
3、发送数据报 datagramSocket.send(datagramPacket);
public
static void
main(String[] args)throws
IOException {
[align=left] //创建一个网络通道[/align]
DatagramSocketdatagramSocket
=
new DatagramSocket();
[align=left] //将数据打包成数据报包[/align]
[align=left] Stringmessage="nnnnnn";[/align]
[align=left] [/align]
DatagramPacketdatagramPacket
=
new DatagramPacket(
[align=left] message.getBytes(),message.getBytes().length,[/align]
[align=left] InetAddress.getByName("192.168.46.19"),[/align]
[align=left] 2345);[/align]
datagramSocket.send(datagramPacket);
[align=left] datagramSocket.close();[/align]
}
3、UDP多播广播
发送数据:
1、创建多播广播通道 new MulticastSocket( );
2、获取组播地址并将广播加入此地址 multicastSocket.jionGroup( InterAddress.getByName("266.81.9.8") );
3、构建datagramPacket,包含byte[]的内容,byte[]长度,ip,端口号。当然可以不用在构建方法添加ip和端口号。
4、发送消息:multicastSocket.send(datagramPacket);
publicstatic
void
main(String[] args)
throws
IOException {
MulticastSocketmulticastSocket
=
new MulticastSocket();
InetAddressgroup
= InetAddress.getByName("226.81.9.8");
[align=left] multicastSocket.joinGroup(group);[/align]
Stringcontent
=
"刷屏100遍";
[align=left] [/align]
DatagramPacketdp
=
new DatagramPacket(content.getBytes(),content.getBytes().length);
[align=left] dp.setAddress(group);[/align]
[align=left] dp.setPort(2426);[/align]
[align=left] [/align]
[align=left] multicastSocket.send(dp);[/align]
}
接收数据:阻塞式,需要单独作为一个线程
1、创建多播广播通道:new MuliticastSocket(2426); 构造方法应当包含开启的端口号
2、获取广播地址,并加入此广播地址 muliticast.jionGroup(InterAddress.getByName("192.22.22.2"));
3、创建你个空的btye[]数组。和一个datdagramPacke对象。包含btye[]相关信息
4、接收数据:mutilicastSocket.receive(datagramPacket);
5、读取datagramPacket内容:利用String的构造方法
publicstatic
void
main(String[] args)
throws
IOException {
MulticastSocketms=new
MulticastSocket(2426);
InetAddressgroup
= InetAddress.getByName("226.81.9.8");
[align=left] ms.joinGroup(group);[/align]
byte[]b
=
new byte[1024];
while (true) {
DatagramPacketdatagramPacket
=
new DatagramPacket(b,b.length);
[align=left] ms.receive(datagramPacket);//接受数据[/align]
Stringstring
=
new String(datagramPacket.getData(),datagramPacket.getOffset(),
[align=left] datagramPacket.getLength()); [/align]
System.out.println(datagramPacket.getAddress()+""+
string);
[align=left] }[/align]
4、NIO
NIO是jdk1.4之后引入的一套全新的IO API,处理数据的方式不同于传统IO,传统IO的处理数据的方式以字节为单位,而NIO是一个Buffer(数据块) 为单位,传统IO属于阻塞式(流在读取数据时如果未读到时,程序会处于阻塞状态);而NIO的处理的方式为非阻塞式方式允许(底层为信号通讯),NIO可以在单线程应用中处理多个客户请求。
相关文章推荐
- Java基础知识强化之网络编程笔记02:Socket通信原理图解
- java实现最基础的socket网络通信
- java实现最基础的socket网络通信
- java网络编程基础Socket通信应用
- 上机题目(0基础)- Java网络操作-Socket实现client和server端通信二(Java)
- java网络编程基础——UDP通信之DatagramSocket
- JAVA网络通信基础【转】
- java基础之 网络和socket
- Socket网络通信理论基础搜集(TCP/IP协议栈与数据包封装+TCP与UDP的区别)
- Java TCP使用Socket进行网络通信(3)
- Java网络编程之Socket通信(一)
- java基础socket通信
- Java TCP使用Socket进行网络通信(4)之往返发送
- Java基础---Java---网络编程---TCP、UDP、UDP-键盘录入方式数据、Socket、TCP复制文件、UDP-聊天
- 黑马程序员--Java基础学习之网络编程(TCP、UDP、Socket、模拟发送和接收数据)
- Java网络编程——使用NIO实现非阻塞Socket通信
- Java网络编程——使用NIO实现非阻塞Socket通信
- Java4Android之socket网络通信基础
- java学习之路——基于UDP的Socket网络通信实例