一、概念
Sockets:
使用TCP协议实现的网络通信Socket相关的类
Datagram:
使用UD协议,将数据保存在用户数据报中,通过网络进行通讯。
Socket在应用层之下,传输层之上的接口层(操作系统提供给用户访问网络的系统接口)
Socket套接字:
网络上具有唯一标识的IP地址和端口组合一起才能构成唯一能识别的标识符套接字。
Socket原理机制:
通信的两端都有Socket
网络通信其实就是Socket间的通信
数据在两个socket传送是通过IO流
二、TCP编程
java中基于TCP协议实现网络通信的类
客户端: Socket
服务端:serverSocket
2-1:socket通信的步骤
- 创建serverSocket和Socket
- 打开连接到socket的输入和输出流
- 按照协议对socket进行读/写操作
- 关闭输入/输出流,关闭socket
2-1-1:服务器端
- 创建ServerSocket对象,继续监听端口
- 通过accept()方法监听客户端请求
- 连接建立后,通过输入流读取客户端发送的请求信息
- 通过输出流向客户端发送响应信息
- 关闭相关资源
-
package com.demo.demo.demo2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class TcpServer { public static void main(String[] args) throws IOException { //创建一个服务器端的socket,指定端口,并监听该端口 ServerSocket sc=new ServerSocket(80); try { // Socket scc=sc.accept(); InputStream in= scc.getInputStream(); InputStreamReader inr=new InputStreamReader(in); BufferedReader br= new BufferedReader(inr); String info=null; while((info=br.readLine())!=null){ System.out.println("客户端:"+info); } //socket关闭输入流 scc.shutdownInput(); OutputStream out=scc.getOutputStream(); PrintWriter ww=new PrintWriter(out); ww.write("你好啊。客户端"); ww.flush(); scc.shutdownOutput(); ww.close(); out.close(); br.close(); inr.close(); in.close(); scc.close(); sc.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
2-1-2客户端
- 创建socket对象,指明需要连接的服务器的地址和端口号
- 连接建立后。通过输出流向服务器端发送请求信息
- 通过输入流获得服务器相应的信息
- 关闭相关信息
package com.demo.demo.demo2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket sc=new Socket("localhost",80);
OutputStream oo=sc.getOutputStream();
PrintWriter pr=new PrintWriter(oo);
pr.write("我是一号客户端");
pr.flush();
sc.shutdownOutput();
InputStream is=sc.getInputStream();
InputStreamReader re=new InputStreamReader(is);
BufferedReader rrr=new BufferedReader(re);
String info=null;
while((info=rrr.readLine())!=null){
System.out.println(info);
}
sc.shutdownInput();
rrr.close();
re.close();
re.close();
pr.close();
oo.close();
}
}
2-1-3:套接字超时(客户端)
1. 可为套接字设置超时操作,即:当读写操作没有在规定时间内完成,则会抛出SocketTimeoutException异常
通过方法: setSoTimeout(毫秒数) 设置
2. new 出socket(String host,int port),这个socket会一直阻塞,直到建立起初始连接为止。
可先建立无连接的套接字,再使用一个超时来连接的方式解决问题。
//--------当socket没有建立起与主机的初始连接,会一直阻塞----------------
Socket s=new Socket("192.168.1.1","80")
//-----------------------解决方式---------------------10s---
Socket s=new Socket();
s.connect(new InetSocketAddress("192.168.1.1","80"),10000 );
2-1-4:关于因特网地址
package com.demo.demo.demo2;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InternetAdd {
public static void main(String[] args) throws UnknownHostException {
InetAddress[] an=InetAddress.getAllByName("www.baidu.com");
for(InetAddress a :an){
System.out.println(a);
}
}
}
2-1-5:应用多线程实现服务器与多客户端之间的通信
- 服务器端创建ServerSocket,循环调用accept()等待客户端连接
- 客户端创建一个socket并请求与服务器端连接。
- 服务器接受请求,创建socket与客户端建立专线连接
- 建立连接的两个socket在一个单独的线程上对话
- 服务器继续等待新的连接
三、UDP编程
UDP协议(用户数据报协议)是无连接的,不可靠的,无序的,速度的
进行数据传输中,首先将要传输的数据定义为数据报,大小限制为64k,在数据报中指明数据所要达到的Socket(主机地址和端口号),然后再将数据报发送出去
DatagramPacket类:表示数据报包
DatagramSocket类 :进行端到端通信的类
3-1:服务器端实现步骤
创建DatagramSocket,指定端口号
创建DatagramSocket
接收客户端发送的数据信息
读取数据
3-2:客户端实现步骤
定义发送信息
创建DatagramPacket,包含将要发送的信息
创建DatagramSocket
发送数据