JAVA基础----网络编程

来源:互联网 发布:人生真相知乎 编辑:程序博客网 时间:2024/04/29 23:55
网络编程: Socket编程


网络编程的三个要素

IP地址:


有32位或者128位表示, 常用的IP地址是32位  也就是IPV4,  128位代表IPV6

IP地址的分类:


A: 1.0.0.1 -- 127.255.255.25410.x.x.x 是私有地址


B类128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。


C类192.0.0.1---223.255.255.254 192.168.X.X是私有地址


D类224.0.0.1---239.255.255.254


E类240.0.0.1---247.255.255.254



口号:


0-65535 其中0-1024为系统保留端口


传输协议:
UDP协议:
面向无连接的协议,速度快,不安全

用来视频聊天,语音聊天



TCP协议:
面向有连接的协议,速度稍慢,安全,会进行三次握手操作

数据的传输




使用UDP进行数据的传输:

发送端:


1: 创建UDP协议的发送端DatagramSocket对象
2:  把要发送的数据 ,封装成 数据报包  使用DatagramPacket对象完成
3:  发送数据报包, send(dp)方法

4:  关闭Socket流, 使用close()方法


public static void main(String[] args) {System.out.println("启动发送端");DatagramSocket ds = null;try {<span style="white-space:pre"></span>//<span style="font-size:24px;">创建UDP协议的发送端DatagramSocket对象</span>ds = new DatagramSocket();//<span style="font-size:24px;">把要发送的数据 ,封装成 数据报包  使用DatagramPacket对象完成</span>

<span style="font-size:24px;"><span style="white-space:pre"></span>byte[] by = "我来了。。。。。。。".getBytes();</span>
<span style="font-size:24px;">InetAddress ia = InetAddress.getByName("127.0.0.1");</span>
<span style="font-size:24px;"><span style="white-space:pre"></span>//<span style="font-size:24px;"> 发送数据报包, send(dp)方法</span>ds.send(new DatagramPacket(by, by.length, ia, 10000));} catch (SocketException e) {System.out.println("端口无法应用");return;} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {<span style="white-space:pre"></span>//<span style="font-size:24px;"> 关闭Socket流, 使用close()方法</span>ds.close();}}</span>




接收端:


1:  创建UDP协议的接收端DatagramSocket对象
2;  创建空的数据报包, 用来存储接收到的数据
3:  接收数据,把数据存储到空的数据报包中
4: 解析数据报包中的数据
获取IP地址  getAddress();
获取数据:  getData();
获取数据的长度: getLength();

5:  关闭Socket流,使用close()方法

public static void main(String[] args) {DatagramSocket ds = null;try {
<span style="white-space:pre"></span>//<span style="font-size:24px;">创建UDP协议的接收端DatagramSocket对象</span>ds = new DatagramSocket(10000);
byte[] by = new byte[1024];
<span style="white-space:pre"></span>//<span style="font-size:24px;"> 创建空的数据报包, 用来存储接收到的数据</span>
DatagramPacket dp = new DatagramPacket(by, by.length);
<span style="white-space:pre"></span>//<span style="font-size:24px;">接收数据,把数据存储到空的数据报包中</span>ds.receive(dp);<span style="white-space:pre"></span>
<span style="white-space:pre"></span>//<span style="font-size:24px;">解析数据报包中的数据  <span style="font-size:24px;">获取IP地址  getAddress();</span></span>InetAddress ia = dp.getAddress();
<span style="white-space:pre"></span>//<span style="font-size:24px;">获取数据:  getData();</span>System.out.println(ia.getHostAddress());
<span style="white-space:pre"></span>//<span style="font-size:24px;">获取数据的长度: getLength();</span>int in = dp.getLength();
String str = new String(by, 0, in);
System.out.println(str);} catch (Exception e) {} finally {
<span style="white-space:pre"></span>//<span style="font-size:24px;">关闭Socket流,使用close()方法</span>ds.close();}}




使用TCP进行数据的传输:
客户端;
1: 创建客户端的Socket对象
2:  准备要发送的数据
3:  通过Socket对象中的输出流,完成数据的发送
4:  告知服务器 ,数据已发送完毕,  shutdownOutput()
5:  获取服务器的反馈信息
6;  关闭Socket流

public static void main(String[] args) {Socket sk = null;try {// 创建客户端的Socket对象sk = new Socket("127.0.0.1", 12345);// 准备要发送的数据String str = "我来了";// 通过Socket对象中的输出流,完成数据的发送OutputStream os = sk.getOutputStream();os.write(str.getBytes());// 告知服务器 ,数据已发送完毕, shutdownOutput()sk.shutdownOutput();// 获取服务器的反馈信息InputStream is = sk.getInputStream();byte[] by = new byte[1024];int len = is.read(by);str = new String(by, 0, len);System.out.println(str);} catch (Exception e) {} finally {//如果sk不为null则关闭流if (sk != null) {try {// 关闭Socket流sk.close();} catch (IOException e) {e.printStackTrace();}}}}



服务器端:
1:  创建服务器端ServerSocket对象
2:  等待客户端的连接

3:  创建线程对象,并启动,通过每个线程对象,来完成与客户端Socket对象

的数据传输

public static void main(String[] args) throws IOException {// 创建服务器端ServerSocket对象ServerSocket ss = new ServerSocket(11114);while (true) {// 等待客户端的连接Socket s = ss.accept();// 创建线程对象,并启动,通过每个线程对象,来完成与客户端Socket对象<span style="font-size:24px;">的数据传输</span>new TcpServer(s).start();}}


a: 获取IP地址
String ip =  s.getInetAddress().getHostAddress();

b: 获取数据
1): 获取客户端的输入流对象
2): 通过输入流对象, 读取流中的数据
3): 把数据进行处理(打印,存储到文件中)

c: 编写客户端反馈信息
1): 获取客户端的输出流对象
2): 写 给客户端的反馈信息

d: 关闭客户端Socket流



<span style="font-size:24px;">public class TcpServer extends Thread {private Socket s;public TcpServer(Socket s) {super();this.s = s;}@Overridepublic void run() {// 获取IP地址String str1 = s.getInetAddress().getHostAddress();try {// 获取数据BufferedReader br = new BufferedReader(new /* 通过输入流对象, 读取流中的数据 */InputStreamReader(/* 获取客户端的输入流对象 */s.getInputStream()));for (String str = ""; (str = br.readLine()) != null;) {// 把数据进行处理(打印,存储到文件中)System.out.println(str1 + ":" + str);}// 获取客户端的输出流对象OutputStream os = s.getOutputStream();// 写 给客户端的反馈信息os.write("收到".getBytes());} catch (IOException e) {e.printStackTrace();} finally {if (s != null) {try {// 关闭客户端Socket流s.close();System.out.println(str1 + "已退出");} catch (IOException e) {e.printStackTrace();}}}}}</span>




0 0
原创粉丝点击