网络编程之UDP协议和TCP协议

来源:互联网 发布:ipad不良信息过滤软件 编辑:程序博客网 时间:2024/06/05 21:06

UDP协议和TCP协议

UDP协议(用户数据报协议): 需要一个发送端和接收端;发送端:只负责发送数据,不管接收端是否接收到数据.在传输数据的过程中是允许数据报丢失的;特点:    1.需要一个发送端和接收端;    2.发送端只负责发送数据,不管接收端是否接收到数据;    3.在传输数据的过程中是允许数据报丢失的;TCP/IP协议:    特点:        1.需要一个客户端 和 服务器端;        2.不允许出现数据报丢失;        3.使用了三次握手的;

Tcp:

客户端:
1.获得Socket对象
Socket socket=new Socket(address, port);
//参数:address为要连接的电脑ip地址,port为端口
2.然后用socket对象获得i/o流
OutputStream outputStream = socket.getOutputStream();
3.用流写出文件(发送)
outputStream.write(“测试。。。”.getBytes());
4.假如有服务器回执信息
InputStream inputStream = socket.getInputStream();
5.然后读取回执信息
int read = inputStream.read();
6.最后关闭Socket流
socket.close();

public class TCPClient {    public static void main(String[] args) throws Exception {        // 获得客户端对象        Socket socket = new Socket("192.168.145.107", 8888);        // 读取本地文件        BufferedInputStream bufferedInputStream = new BufferedInputStream(                new FileInputStream(                        "C:\\Users\\Administrator\\Pictures\\Camera Roll\\xm.jpg"));        // 获得输出流        OutputStream outputStream = socket.getOutputStream();        int cha = -1;        byte[] b = new byte[1024];        while ((cha = bufferedInputStream.read(b)) != -1) {            outputStream.write(b, 0, cha);        }        socket.shutdownOutput();        //服务端返回信息处理        InputStream inputStream = socket.getInputStream();        byte[] c = new byte[1024];        int len = inputStream.read(c);        System.out.println(new String(c, 0, len));        outputStream.close();        socket.close();        System.out.println("发送完毕!");    }}

服务端:
1.获得ServerSocket对象
ServerSocket serverSocket=new ServerSocket(port);
//此处port必须跟客户端端口保持一致, 不然接收不了数据
2.用ServerSocket对象的accpet()方法,获得Socket对象1
Socket socket = serverSocket.accept();
3.用获得的Socket对象创建读取流,读取客户端Socket发来的消息
InputStream inputStream = accept.getInputStream();
int read = inputStream.read();
4.关闭Socket跟ServerSocket
socket.close();
serverSocket.close();//这个可以不关

public class TCPServer {    public static void main(String[] args) throws Exception {        // 获得服务端对象        ServerSocket serverSocket = new ServerSocket(8888);        // 获得客户端的socket对象        Socket socket = serverSocket.accept();        // 获得socket流        InputStream inputStream = socket.getInputStream();        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(                new FileOutputStream("a.jpg"));        byte[] b = new byte[1024];        int len = -1;        while ((len = inputStream.read(b)) != -1) {            bufferedOutputStream.write(b, 0, len);        }        OutputStream outputStream = socket.getOutputStream();        outputStream.write("接收到了,大兄弟!!!".getBytes());        inputStream.close();        socket.close();    }}

UDP:

发送端:
1.获得DatagramSocket对象
DatagramSocket datagramSocket=new DatagramSocket();
2.创建数据流,获取键盘输入
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
3.循环把输入的内容封装到DatagramPacket数据包对象中
String line=null;
while ((line=bufferedReader.readLine())!=null) {
byte[] b=line.getBytes();
DatagramPacket datagramPacket=new DatagramPacket(b, b.length, InetAddress.getByName(“192.168.145.107”),9001);
datagramSocket.send(datagramPacket);
}
4.关闭Socket流
datagramSocket.close();

public class UDPsent {    public static void main(String[] args) throws Exception {        System.out.println("开始发送!");        // 创建DatagramSocket对象        DatagramSocket datagramSocket = new DatagramSocket();        // 创建读取流,获取键盘录入        BufferedReader bufferedReader = new BufferedReader(                new InputStreamReader(System.in));        // 循环封装到DatagramPacket数据包中        String line = null;        while ((line = bufferedReader.readLine()) != null) {            byte[] buf = line.getBytes();            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length,                    InetAddress.getByName("192.168.145.107"), 9000);            datagramSocket.send(datagramPacket);        }        datagramSocket.close();    }}

获取端:
1.获得DatagramSocket对象注意要选带端口参数的构造方法
DatagramSocket datagramSocket=new DatagramSocket(9001);
2.创建数据包,并创建DatagramPacket对象,两个参数的。
byte[] bs=new byte[1024];
DatagramPacket datagramPacket=new DatagramPacket(bs, bs.length);
3.用Socket的receive方法获得数据包
datagramSocket.receive(datagramPacket);
4.用datagramPacket解析数据
byte[] data = datagramPacket.getData();
System.out.println(new String(data, 0, data.length));
5.关闭Socket流
datagramSocket.close();

public class UDPget {    public static void main(String[] args) throws Exception {        System.out.println("开始接收!");        // 创建DatagramSocket对象并指定端口号,与发送方端口保持一致        DatagramSocket datagramSocket = new DatagramSocket(9000);        // 创建数据包,创建DatagramPacket对象        byte[] b = new byte[1024];        DatagramPacket datagramPacket = new DatagramPacket(b, b.length);        // 利用Socket的receive方法接收数据        datagramSocket.receive(datagramPacket);        // 解析数据包        byte[] data = datagramPacket.getData();        int length = datagramPacket.getLength();        System.out.println(new String(data, 0, length));        // 关闭Socket流        datagramSocket.close();    }}
原创粉丝点击