失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > java网络编程小结(黑马程序员基础java总结)

java网络编程小结(黑马程序员基础java总结)

时间:2018-09-07 00:47:17

相关推荐

java网络编程小结(黑马程序员基础java总结)

网络编程三要素

1.IP地址

IP地址就相当于茫茫信息大海中的灯塔,需要识别到这个标志才可以和对应的计算机进行网络通讯

2.端口

网络通讯其实就是两个应用程序的通讯,每台计算机上有很多程序,端口就是为了区分这些程序

3.协议

计算机网络中也要遵守一系列规则协议,这里主要介绍的是UDP协议和TCP协议

UDP网络协议

概述:UDP是无连接的通讯,当一台计算机向另一台计算机发送数据的时候,发送端不会确认接收端是否存在,就会发送数据,也不需要任何反馈该数据是否已经发送

UDP协议消耗资源小,通讯效率高,常常用作音频,视频和普通数据的传输,例如视频会议通常采用UDP协议,即便偶然丢失一两个数据包,也不会有太大的影响

接受和发送数据大致方法

UDP发送数据

创建发送端的Socket对象创建数据,并且把数据打包调用DatagramSocket对象的方法发送数据关闭发送端

UDP接受数据

创建接收端的Socket对象创建一个数据包,用于接受数据调用DatagramSocket对象的方法接受数据解析数据包,并把数据在控制台显示关闭接收端

获取主机IP地址代码

public static void main(String[] args) throws UnknownHostException {//public static InetAddress getByName(String host):确定主机名称的IP地址,可以是机器名称,也可以是IP地址InetAddress address=InetAddress.getByName("IP地址");//public String getHostName():获取此IP地址的主机名String name=address.getHostName();//public String getHostAddress():返回文本显示中的IP地址字符串String ip=address.getHostAddress();System.out.println("主机名:"+name);System.out.println("IP地址:"+ip);}}

发送和接受数据

无论使用哪种协议,程序都要有一个客户端,一个服务器,客户端发送数据,服务器接受数据。在UDP中不存在服务器,但是也需要一个发送端和一个接受端,而且运行时要保证先打开接受端(服务器),再开启发送端(客户端)

发送端

public static void main(String[] args) throws IOException {//创建发送端的Socket对象//DatagramSocket()构造数据报套接字并将其绑定到本地主机的任何可用端口DatagramSocket ds=new DatagramSocket();//创建数据,并把数据打包//DatagramPacket(byte[] buf,int length, InetAddress address, int port)//构造一个数据包,发送长度为Length的数据包到指定主机上的指定端口号byte[] bys="hh".getBytes();DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("IP地址"),30085);//调用DatagramSocket对象的方法发送数据ds.send(dp);//关闭发送端ds.close();}

接受端

public static void main(String[] args) throws IOException {//创建接收端的Socket对象//DatagramSocket(int port)构造数据报套接字并将其绑定到本地主机上的指定端口DatagramSocket ds=new DatagramSocket(30085);//创建一个数据包,用于接受数据//DatagramPacket(byte[] buf,int length)构造一个DatagramPacket用于接受长度为length的数据包byte[] bys=new byte[1024];DatagramPacket dp=new DatagramPacket(bys,bys.length);//调用DatagramSocket对象的方法接受数据ds.receive(dp);//解析数据包,并且把数据在控制台上显示//byte[] getData()返回数据缓冲区byte[] datas=dp.getData();System.out.println("数据是:"+new String(datas,0,dp.getLength()));//关闭接收端ds.close();}

通讯程序

作为一个简短的网络聊天室

发送端

public static void main(String[] args) throws IOException {//创建发送端的Socket对象DatagramSocket ds=new DatagramSocket();//自己封装键盘录入数据BufferedReader br=new BufferedReader(new InputStreamReader(System.in));String line;while((line=br.readLine())!=null){//输入886,结束if ("886".equals(line)){break;}//创建数据,把数据打包byte[] bys=line.getBytes();DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("IP地址"),12345);ds.send(dp);}ds.close();}

接收端

接受端使用while死循环就是为了保证接受端可以保持一直开启的状态

public static void main(String[] args) throws IOException {//创建接收端的Socket对象DatagramSocket ds=new DatagramSocket(12345);while (true){//创建一个数据包,用于接受数据byte[] bys=new byte[1024];DatagramPacket dp=new DatagramPacket(bys,bys.length);//调用DatagramSocket对象的方法接受数据ds.receive(dp);//解析数据包System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));}}

TCP网络协议

概述:TCP协议是面向连接的通讯协议,传输数据之前,在发送端和接收端建立逻辑链接,他提供了可靠无差错的数据传输,每次连接的创建都需要“三次握手”

第一次:客户端想服务器发出连接请求,等待服务器确认

第二次:服务器向客户端回送一个响应,通知客户端收到了连接请求

第三次:客户端再次向服务器发送确认信息,确认链接

接受和发送数据的大致方法

发送数据

创建客户端的Socket对象获取输出流,写数据释放资源

接受数据

创建服务器端的Socket对象监听客户端连接,返回一个Socket读一下获取输入流,读数据,并把数据显示在控制台释放资源

发送和接受数据(有反馈)

客户端

public static void main(String[] args) throws IOException {//创建客户端的Socket对象(Socket)Socket s=new Socket("IP",11222);//获取输出流,写数据OutputStream os=s.getOutputStream();os.write("hello,tcp".getBytes());//接受服务器反馈InputStream is=s.getInputStream();byte[] bys=new byte[1024];int len=is.read(bys);String data=new String(bys,0,len);System.out.println("客户端:"+data);s.close();}

服务器

public static void main(String[] args) throws IOException {//创建服务器端的Socket对象(ServerSocket)//ServerSocket(int port)创建绑定到指定端口的服务器套接字ServerSocket ss=new ServerSocket(11222);//Socket accept()侦听要连接到此套接字并接受它Socket s=ss.accept();//获取输入流,读数据,并把数据显示在控制台InputStream is=s.getInputStream();byte[] bys=new byte[1024];int len=is.read(bys);String data=new String(bys,0,len);System.out.println("服务器:"+data);//给出反馈OutputStream os=s.getOutputStream();os.write("数据已经收到".getBytes());//释放资源s.close();ss.close();}

传输数据

键盘录入上传

客户端

public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s=new Socket("IP",13333);//数据来自于键盘录入,直到输入的数据是886,发送数据结束BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//封装输出流对象BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line;while ((line=br.readLine())!=null){if ("886".equals(line)){break;}bw.write(line);bw.newLine();bw.flush();}//释放资源s.close();}

服务器

public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss=new ServerSocket(13333);//监听客户端连接,返回一个对应的Socket对象Socket s=ss.accept();//获取输入流BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));String line;while ((line=br.readLine())!=null){System.out.println(line);}//释放资源ss.close();}

客户端数据来自文本文件

客户端

public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s=new Socket("IP",12340);//封装文本文件数据BufferedReader br=new BufferedReader(new FileReader("D:\\Java\\笔记\\java网络编程\\bw.txt"));//封装输出流写数据BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line;while ((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}//释放资源br.close();s.close();}

服务器

public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss=new ServerSocket(12340);//监听客户端连接,返回一个对应的Socket对象Socket s=ss.accept();//获取输入流BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));String line;while ((line=br.readLine())!=null){System.out.println(line);}//释放资源ss.close();}

服务器数据写入文件

客户端

public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s=new Socket("IP",12345);//数据来自于键盘录入,直到输入的数据是886,发送数据结束BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//封装输出流对象BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line;while ((line=br.readLine())!=null){if ("886".equals(line)){break;}bw.write(line);bw.newLine();bw.flush();}//释放资源s.close();}

服务器

public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss=new ServerSocket(12345);//监听客户端连接,返回一个对应的Socket对象Socket s=ss.accept();//接受数据BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));//把数据写入文件BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\Java\\笔记\\java网络编程\\bw.txt"));String line;while ((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}//释放资源bw.close();ss.close();}

上传文件给服务器

客户端

public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s=new Socket("IP",32341);//封装文本文件数据BufferedReader br=new BufferedReader(new FileReader("D:\\Java\\笔记\\java网络编程\\src\\UDP获取主机IP地址\\InnetAddressDemo.java"));//封装输出流写数据BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line;while ((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}//释放信号给服务器,我写完了s.shutdownOutput();//接受反馈BufferedReader brClient=new BufferedReader(new InputStreamReader(s.getInputStream()));String data=brClient.readLine();//等待读取数据System.out.println("服务器的反馈:"+data);//释放资源br.close();s.close();}

接收端

public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss=new ServerSocket(32341);//监听客户端连接,返回一个对应的Socket对象Socket s=ss.accept();//接受数据BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));//把数据写入文本文件BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\Java\\笔记\\java网络编程\\bw1.java"));String line;while ((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}BufferedWriter bwServer=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));bwServer.write("文件上传成功");bwServer.newLine();bwServer.flush();bw.close();ss.close();}

多线程上传文件

核心思想在于模拟多个客户端给服务器上传文件,每开启一个接口相当于开启一个新的线程

客户端

public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s=new Socket("127.0.0.1",33445);//封装文本文件数据BufferedReader br=new BufferedReader(new FileReader("D:\\Java\\笔记\\java网络编程\\bw.java"));//封装输出流写数据BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line;while((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}s.shutdownOutput();//接受反馈BufferedReader brClient=new BufferedReader(new InputStreamReader(s.getInputStream()));String data=brClient.readLine();//等待读取数据System.out.println("服务器的反馈"+data);//释放资源br.close();s.close();}

服务器

public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss=new ServerSocket(33445);while (true){//监听客户端连接,返回一个Socket对象Socket s= ss.accept();//为每一个客户端开启一个线程new Thread(new ServerThread(s)).start();}}

线程

实现Runnable接口,创建新的线程

public class ServerThread implements Runnable{private Socket s;public ServerThread(Socket s){this.s=s;}@Overridepublic void run() {try{//接受数据写到文本文件BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));// BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\Java\\笔记\\java网络编程\\bw.java"));//解决重名问题int count=0;File file=new File("D:\\Java\\笔记\\java网络编程\\bw["+count+"].java");while (file.exists()){count++;file=new File("D:\\Java\\笔记\\java网络编程\\bw["+count+"].java");}BufferedWriter bw=new BufferedWriter(new FileWriter(file));String line;while ((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}//给出反馈BufferedWriter bwServer=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));bwServer.write("文件上传成功");bwServer.newLine();bwServer.flush();//释放资源s.close();}catch (IOException e){e.printStackTrace();}}

如果觉得《java网络编程小结(黑马程序员基础java总结)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。