利用UDP还有TCP进行java通信

本文介绍了Java中DatagramSocket类的使用,包括构造方法、基本方法和发送数据报的方法。详细阐述了UDP通信的过程,指出只能客户端先发消息给服务端的问题及解决方案,并提及了可能出现的中文乱码问题。
摘要由CSDN通过智能技术生成

想学习一个类,不如先了解这个类中有什么方法!

DatagramSocket类 用法详解:

一:构造方法

    1.DatagramSocket():

  表示创建一个默认的套接字,并绑定到本地地址和一个随机的端口号

  2.DatagramSocket(int port):

  与上面不同的是,绑定到特定端口号,其它不变

  3.DatagramSocket(int port, InetAddress iad):

  表示创建一个套接字,绑定到特定的端口号及指定地址

  4.DatagramSocket(SocketAddress sad);

  表示创建一个套接字,绑定到特定的套接字地址

 二:基本方法

       1.  close():

  关闭套接字

  2.recevie(DatagramPacket dp):

  接受数据报

  3.send(DatagramPacket dp):

 三:发送数据报:

  DatagramPacket类:

  构造方法:(只列出主要的)

  1.接受类型:

  DatagramPacket(byte[] buf, int length):

  用来接受长度为length的buf数据(即数据存于字节数组buf中)

  2.发送类型:

  DatagramPacket(byte[] buf, int length, InetAddress address, int port);

  将length长的buf数据发送到指定的地址的端口号处

  DatagramPacket(byte[] buf, int length, SocketAddress address);

     四.读入数据:

        BufferedReader可以用来读取文件或者接收来自键盘(控制台)的信息。它比Scanner更加快捷,能够大幅度缩短程序运行时间。它下面的readline()方法可以一次性读取一行文字(String),非常方便。需要注意的是,使用BufferedReader对象的readLine()方法必须处理java.io.IOException异常(Exception)。以及,在使用完BufferredReader以后,需要用close()方法关闭流。

         InputStreamReader是字节流通向字符流的桥梁,封装了InputStream里面,她以高级的形式一次读取一个一个字符,以文本格式输入输出,可以指定编码格式;

         每次调用IntputStreamReader中的read()方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节

         为了达到最高效率,可要考虑在 BufferedReader内包装InputStreamReader:

例如:

        1.接收控制台信息时:

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

        2.读取文件时:

BufferedReader br = New BufferedReader(data);

        3.它的realine()方法:

public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        String s= input.readLine();
        input.read(o);
        }

DatagramPacket表示存放数据的数据报,DatagramSocket表示接受或发送数据报的套接字

三:UDP的简单应用(简单通信,可以反复说话)

代码实现发送端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;

public class Send {

	public static void main(String[] args) throws Exception {
		//首先建立socket对象
		DatagramSocket dsocket = new DatagramSocket();
		//写信
		while(true) {//循环说话
			//发送数据
		BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
		String str = read.readLine();
		//发送要通过一个数据包,这个数据包相当有一个信封,信封组成:发送的数据,长度,收件人的地址,收件人的邮编
		DatagramPacket sendpacketage = new DatagramPacket(str.getBytes(),//需要转换成byte,发送的数据 
				str.length(),//获取长度
				InetAddress.getByName("127.0.0.1"),//自己的地址,发件人要填自己的地址
				8000); //想象成邮编
		//发送
		dsocket.send(sendpacketage);
		byte []buf = new byte[1024];
		DatagramPacket recivicepacket = new DatagramPacket(buf, buf.length);
		dsocket.receive(recivicepacket);
		System.out.println(new String(buf,0,recivicepacket.getLength()));
	}
	}
}

 

代码实现接收端:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值