socket套接字编程 ---- UDP/TCP编程Demo

这部分为大家介绍套接字的实现。分为三部分:1.介绍一些网络模型 2. 介绍一些基础常识  3.书写小demo

一、网络模型:

7层网络模型

1》应用层:提供给操作系统或者应用程序,用来进行网络通信的标准接口

2》表示层:不同的pc机拥有不同的编码方式,需要在这里进行转换,换成网络通信中采用的标准表现形式

3》会话层:负责在不同的PC的不同进程之间建立或者拆除连接,另外,还有插入同步点的机制(保证断线重新从这个位置传输)

4》传输层:负责两个主机之间的端对端的数据连接&传输

5》网络层:选择合适的路由,职责就是正确的找着目的站

6》数据链路层:负责在两个相邻的节点之间准确的传输数据(以帧为单位,每一帧:数据+控制信息)

7》物理层:原始的数据比特流在物理介质上传输

         IP层在传输层哪个,UDP和TCP在会话层,使用java的套接字,主要针对的是会话层编程,实现连接和通信。

二:基础知识:

1.      IP:标记每天主机在互联网上的地址,每4组数表示一个IP地址,每一组数在0-255之间。

2.      端口号:端口可以认为是计算机设备和外界通讯交流的出口。目前一台电脑有65536个端口,端口号在0-65535之间,其中0-1024为已用的端口号。

3.      DNS解析服务器:我们访问一台服务器,有两种方式访问,一种是通过ip,第二种就是域名。那么域名如何定位到要寻找的IP呢?这就需要我们用的DNS服务器来讲域名和IP一一对应。所以说,最本质还是通过互联网上唯一的IP进行访问。

三:java的互联网编程:

1.      Udp编程:

UDP 是User Datagram Protocol的简称,中文名是用户数据报协议。基于流的。不建立连接,不可靠;传输速率相对较高;需要对数据进行封包,每个包不超过64K。---适用于要求速度而不要求可靠性的场景---视频聊天、直播。

发送端和接收端:DatagramSocket、DatagramPacket

Demo 案例:使用UDP实现单人聊天:

importjava.net.DatagramPacket;

importjava.net.DatagramSocket;

import java.net.InetSocketAddress;

importjava.util.Scanner;

 

public class ChatExer {

 

         publicstatic void main(String[] args) {

 

                   newThread(new Receiver()).start();

                   newThread(new Sender()).start();

 

         }

 

}

 

class Sender implements Runnable {

 

         privateDatagramSocket ds;

         privateDatagramPacket dp;

 

         @SuppressWarnings("resource")

         @Override

         public voidrun() {

 

                   try{

                            //创建套接字对象

                            ds= new DatagramSocket();

 

                            Scanners = new Scanner(System.in);

 

                            while(true) {

 

                                     //读取数据

                                     Stringmsg = s.nextLine();

 

                                     //将数据封包

                                     dp= new DatagramPacket(msg.getBytes(), msg.getBytes().length,

                                                        newInetSocketAddress("255.255.255.255", 8080));

 

                                     //发送数据

                                     ds.send(dp);

                            }

 

                   }catch (Exception e) {

                            e.printStackTrace();

                   }

 

         }

 

}

 

class Receiver implements Runnable {

 

         privateDatagramSocket ds;

         privateDatagramPacket dp;

 

         @Override

         public voidrun() {

 

                   try{

                            //创建套接字对象,绑定端口号

                            ds= new DatagramSocket(8080);

 

                            //准备数据包

                            dp= new DatagramPacket(new byte[1024], 1024);

 

                            while(true) {

 

                                     //接受数据

                                     ds.receive(dp);

 

                                     //解析数据

                                     System.out.println(dp.getAddress()+ ":");

                                     System.out.println(newString(dp.getData(), 0, dp.getLength()));

 

                            }

 

                   }catch (Exception e) {

                            e.printStackTrace();

                   }

 

         }

 

}

2.      基于TCP实现:

TCPTransmission Control Protocol 传输控制协议)是一种面向连接的可靠的基于字节流的传输层通信协议。基于流的。建立连接,经过三次握手,可靠。传输速率相对较慢。理论上不限制数据大小。

Demo 案例:使用tcp发送和接收数据

import java.io.InputStream;

import java.io.OutputStream;

import java.net.InetSocketAddress;

import java.net.Socket;

 

public class TCPClientDemo {

 

         publicstatic void main(String[] args) throws Exception {

 

                   //创建客户端的套接字对象

                   Sockets = new Socket();

 

                   //发起连接

                   s.connect(newInetSocketAddress("localhost", 8080)); // 阻塞

 

                   //获取输出流

                   OutputStreamout = s.getOutputStream();

 

                   //写出数据

                   out.write("hello,服务器端~~~".getBytes());

 

                   //通知服务器端数据全部写出完毕

                   s.shutdownOutput();

 

                   //读取服务器端打回的消息

                   InputStreamin = s.getInputStream();

                   byte[]bs = new byte[1024];

                   intlen = -1;

                   while((len = in.read(bs)) != -1) {

                            System.out.println(newString(bs, 0, len));

                   }

                   s.shutdownInput();

 

                   //关流

                   s.close();

         }

 

}

 

 

 

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

 

public class TCPServerDemo {

 

public static void main(String[]args) throws Exception {

 

           // 创建服务器端的套接字对象,监听指定的端口号

           ServerSocket ss = newServerSocket(8080);

 

           // 接受连接

           Socket s = ss.accept();// 阻塞

 

           // 获取输入流

           InputStream in =s.getInputStream();

 

           // 读取数据

           byte[] bs = newbyte[1024];

           int len = -1;

           while ((len =in.read(bs)) != -1) {

                    System.out.println(newString(bs, 0, len));

           }

 

           // 通知客户端数据已经读取完毕

           s.shutdownInput();

 

           // 服务器端向客户端打回消息

           OutputStream out =s.getOutputStream();

           out.write("注册成功~~~".getBytes());

           s.shutdownOutput();

 

           // 关流

           ss.close();

 

}

 

}

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值