网络编程
1.架构
2.网络编程三要素:ip地址,端口号,协议
检查双方网路是否畅通:可以跟网址,亦可以跟数据
3.inetAddress类(以下三个是类的方法)
主机ip地址:ipconfig
主机名称:hostname
得到主机名,并且获得ip和名字的方法演示:
4.端口号
5协议:
6.udp数据发送
7.接收数据,单播
8.传输文件代码,最好两个开着,否则数度太快接受不到数据
发送端:
import java.io.IOException; import java.net.*; import java.util.Scanner; public class InterProgramSend { public static void main(String[] args) throws IOException { //按照下面的要求实现程序 //UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束 // UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收 //生成发送的快递公司,可以指定端口,也可以不写使用默认的 DatagramSocket ds = new DatagramSocket(); //生成发送包裹,可以传地址也可以传主机名。 InetAddress address = InetAddress.getByName("10.101.140.191"); //得到主机名 String ip =address.getHostAddress(); //得到端口号 int port = 10086; String str; Scanner sc = new Scanner(System.in); str = sc.next(); int aimNum = Integer.parseInt(str); while(aimNum!=886) { DatagramPacket dp = new DatagramPacket(str.getBytes(), 0, str.getBytes().length, address, port); ds.send(dp); str = sc.next(); aimNum = Integer.parseInt(str); } ds.close(); } }
接收端:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class InterProgramReceive { public static void main(String[] args) throws IOException { DatagramSocket ds = new DatagramSocket(10086); InetAddress inetAddress = InetAddress.getByName("10.101.140.191"); String ip = inetAddress.getHostAddress(); byte[] bytes = new byte[1024]; DatagramPacket dp = new DatagramPacket(bytes,bytes.length); System.out.println("我看看有没有运行"); ds.receive(dp); System.out.println(dp.getAddress()); System.out.println(new String(dp.getData())); System.out.println("我看看有没有接完"); } }
8.接收数据,组播
//这是组播的方式 //生成组播发送方式和端口 MulticastSocket ms = new MulticastSocket(10000); //主机地址 InetAddress address = InetAddress.getByName("224.0.0.1"); //加入 ms.joinGroup(address); String str; Scanner sc = new Scanner(System.in); str = sc.next(); while(!str.equals("886")) { DatagramPacket dp = new DatagramPacket(str.getBytes(), 0, str.getBytes().length, address, 10000); ms.send(dp); str = sc.next(); } ms.close();
//这是组播方式 MulticastSocket ms = new MulticastSocket(10000); InetAddress inetAddress = InetAddress.getByName("224.0.0.1"); ms.joinGroup(inetAddress); byte[] bytes = new byte[65]; DatagramPacket dp = new DatagramPacket(bytes,bytes.length); System.out.println("我看看有没有运行"); ms.receive(dp); System.out.println(dp.getAddress()); System.out.println(new String(dp.getData(),0,dp.getLength()));//除八是因为八个字节表示一个数,如果不想÷8则dp.length()即可。 System.out.println("我看看有没有接完");
9.接收数据,广播(改个端口号就行)
10.Tcp通信及其代码,会出现乱码的情况,但是UDP好像没有遇见。因为Tcp面向字节,而Udp面向报文。
11.Tcp传输练习,UUID生成文件序列符
flush() 是把缓冲区的数据强行输出,主要用在IO中,即清空缓冲区数据,一般在读写流(stream)的时候,数据是先被读到了内存中,再把数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,因为还有一部分有可能会留在内存这个缓冲区中。这时候如果你调用了close()方法关闭了读写流,那么这部分数据就会丢失,所以应该在关闭读写流之前先flush()。 |
发送端
//这是作业 //TCP通信练习2---接收和反馈 //客户端:发送一条数据,接收服务端反馈的消息并打印服务器:接收数据并打印,再给客户端反馈消息 //创建发送数据的通道 /* Socket socket = new Socket("127.0.0.1",10564); OutputStream os = socket.getOutputStream(); Scanner sc = new Scanner(System.in); String str = sc.next(); while(!str.equals("886")){ os.write(str.getBytes()); str = sc.next(); } //关闭发送 socket.shutdownOutput(); //创建接受反馈的通道 InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); int len ; while((len = isr.read())!=-1){ System.out.println((char) len); } os.close(); socket.close();*/ //客户端:将本地文件上传到服务器。接收服务器的反馈。 // 服务器:接收客户端上传的文件,上传完毕之后给出反馈。 //生成端口 Socket socket = new Socket("127.0.0.1",10056); //文件来源 File file = new File("D:\\JavaStudyDir\\c.png"); //读取文件 FileInputStream fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis); //生成输出流 BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); //读文件和写文件 int len; while ((len = bis.read())!= -1){ bos.write(len); } bos.flush(); //关闭输出文件通道 Thread thread = Thread.currentThread(); thread.sleep(1000); socket.shutdownOutput(); InputStream returnIs = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(returnIs); int returnLen; while ((returnLen = isr.read())!=-1){ System.out.println((char) returnLen); }
接收端
//这是作业 //TCP通信练习2---接收和反馈 //客户端:发送一条数据,接收服务端反馈的消息并打印服务器:接收数据并打印,再给客户端反馈消息 //创建接收数据的通道 /* ServerSocket socketSocket = new ServerSocket(10564); Socket socket = socketSocket.accept(); InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); int len ; while((len = isr.read())!=-1){ System.out.println((char) len); } //创建发送反馈的通道 OutputStream os = socket.getOutputStream(); Scanner sc = new Scanner(System.in); String str = sc.next(); while(!str.equals("886")){ os.write(str.getBytes()); str = sc.next(); } os.close(); socket.close();*/ //客户端:将本地文件上传到服务器。接收服务器的反馈。 // 服务器:接收客户端上传的文件,上传完毕之后给出反馈。 //生成文件的序列号 UUID uuid = UUID.randomUUID(); String uid = uuid.toString().replace("-",""); //生成端口 ServerSocket serverSocket = new ServerSocket(10056); Socket socket = serverSocket.accept(); //生成接收数据通道 InputStream is = socket.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); //写出文件地址 File file = new File("D:\\JavaStudyDir\\"+uid+".png"); //生成输出文件通道 OutputStream bos = new FileOutputStream(file); //输出文件 int len; while ((len = bis.read())!=-1){ bos.write(len); } //反馈数据 OutputStream os = socket.getOutputStream(); String str="收到了"; os.write(str.getBytes()); //关闭资源 os.close(); bos.close(); bis.close();