黑马程序员------Java基础-----网络编程
来源:互联网 发布:js函数返回值return 编辑:程序博客网 时间:2024/05/21 10:13
黑马程序员——Java基础—–网络编程
——- android培训、java培训、期待与您交流! ———-
1、IP地址
在互联网上每一台计算机都有唯一的表示自己的标记,这个标记就是IP地址,IP地址是使用32位长度的二进制数据表示如:192.168.1.103。
2.TCP协议和UDP协议的区别
TCP协议面向连接的,而UDP协议时面向非连接的。TCP协议时可靠的传输协议,在传输数据时不会丢失数据。而UDP协议时不可靠的传输协议,在传输数据的过程中容易丢失数据。所以TCP协议传输数据的速度没有UDP协议的速度快
3、InetAddress类
intentAddress类主要是表示Ip地址的中有以下的常用方法:
getByName():通过主机名得到InetAddress对象
getLocalHost():通过本机得到InetAddress对象
getHostName():得到IP地址
isReachable():判断地址是否可以到达,同时指定超时时间
4、TCP程序设计
在java中使用Socket来完成TCP程序开发,使用此类可以方便地建立可靠的,双向的、持续的、点对点的通信连接。
在服务器端用到是ServerSocket类,用于接受客户端地请求。在服务器端每次运行时都要使用accept()方法等待客户端的连接,此方法执行之后服务器端将进入阻塞状态,直到客户端连接之后程序才能继续向下执行。
在客户端,程序可以通过Socket类地getInputStream()方法取得服务器的输出信息,在服务器端可以通过getOutputStream()方法取得客户端地输出信息。
示例:
/* 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。 */ //客户端 import java.net.*; import java.io.*; class TcpClient { public static void main(String[] args) throws Exception { //1、创建客户端的Socket服务。指定目的主机和端口 Socket s=new Socket("127.0.0.1",10000); //2、获取Socket流中输出流,发送数据 OutputStream out=s.getOutputStream(); out.write("你好!".getBytes()); //3、获取Socket流中的输入流,用来接收服务端的反馈信息并打印 InputStream in=s.getInputStream(); byte[] buf=new byte[1024]; int len=in.read(buf);//读取反馈的数据 //输出接收的数据 System.out.println(new String(buf,0,len)); s.close();//关闭资源 } } //服务端 class TcpServer { public static void main(String[] args)throws Exception { //1、创建服务端的Socket服务,并监听一个端口 ServerSocket ss=new ServerSocket(10000); //2、通过accept方法获取连接过来的客户端对象。 Socket s=ss.accept(); //获取客户端ip String ip=s.getInetAddress().getHostName(); System.out.println(ip+"connected...."); //3、获取对应客户端对象的读取流读取发过来的数据,并打印 InputStream in=s.getInputStream(); byte[] buf=new byte[1024]; int len=in.read(buf); System.out.println(new String(buf,0,len)); //4、调用对应的客户端的输出流写入返回数据 OutputStream out=s.getOutputStream(); out.write("哥们,收到!".getBytes()); //关闭资源 s.close(); ss.close();//可选操作 } }
5、UDP程序设计
使用UDP发送数据的数据,对方不一定能接收到。所有的信息使用数据报的形式发送出去,所以这就要求客服端要始终保持着等待接受服务器端发过来的数据,在Java中使用DatagramSocket类和DatargramPacket类来完成程序的开发。
DatagramSocket类来完数据发生的操作,DatagramPacket类来完成数据的包装。
/* udp发送端: 需求:通过udp传输方式,将一段文字数据发送出去。 */ import java.net.*; class UdpSend { public static void main(String[] args)throws Exception { //1、创建udp服务。通过DatagramSocket对象 DatagramSocket ds=new DatagramSocket(); //2、确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port) byte[] buf="udp shi shen ma".getBytes(); DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.175"),10000); //3、通过Socket服务,将已有的数据包发送出去。通过send方法。 ds.send(dp); //4、关闭资源 ds.close(); } } /* udp接收端 需求:定义一个应用程序,用于接收udp协议传输的数据并处理。 */ class UdpReceive { public static void main(String[] args)throws Exception { //1、创建udp Socket服务,建立端点 //DatagramSocket ds=new DatagramSocket(10000); //一直处于接收状态 while(true) { //1、创建udp Socket服务,建立端点 DatagramSocket ds=new DatagramSocket(10000); //2、定义数据包。用于存储数据 byte[] buf=new byte[1024]; DatagramPacket dp=new DatagramPacket(buf,buf.length); //3、通过Socket服务的receive方法将接收到的数据存入数据包中 ds.receive(dp);//阻塞式方法 //4、通过数据包的方法获取其中的数据 String ip=dp.getAddress().getHostName(); String data=new String(dp.getData(),0,dp.getLength()); int port=dp.getPort(); System.out.println(ip+"::"+data+"::"+port); //5、关闭资源 ds.close(); } //5、关闭资源 //ds.close(); } }
下面是学习过程中,做过的几个小练习:
练习一:
/* 需求:并发上传图片 */ import java.io.*; import java.net.*; //客户端 class PicClient { public static void main(String[] args) throws Exception { //对传入的值进行判断 if (args.length!=1) { System.out.println("请指定一个图片文件!"); return; } File file=new File(args[0]); //对文件路径进行判断 if (!(file.exists()&&file.isFile())) { System.out.println("你上传的文件有问题,非文件或者不存在!"); return; } //判断是否是图片文件 if (!file.getName().endsWith(".jpg")) { System.out.println("图片格式错误,请重新选择!"); return; } //对文件大小进行判断 if (file.length()>1024*1024*5) { System.out.println("你上传的文件过大,居心叵测!"); return; } //创建服务 Socket s=new Socket("localhost",10000); //读取图片数据 FileInputStream fis=new FileInputStream(file); //用Socket服务输出流写入数据 OutputStream out =s.getOutputStream(); BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream())); byte[] buf=new byte[1024]; int len=0; while ((len=fis.read(buf))!=-1) { out.write(buf,0,len); } //结束标记,表示文件数据已经上传完了 s.shutdownOutput(); String info=in.readLine();//读取返回信息 System.out.println(info); fis.close();//关流 s.close(); } } //服务端 class PicServer { public static void main(String[] args)throws Exception { //创建服务,监听端口 ServerSocket ss=new ServerSocket(10000); while (true) { //获取客户端对象 Socket s=ss.accept(); //客户端执行线程 new Thread(new PicThread(s)).start(); } //ss.close(); } } //利用多线程实现并发上传 class PicThread implements Runnable { private Socket s; PicThread(Socket s) { this.s=s; } public void run() { int count=1; //获取客户端ip String ip=s.getInetAddress().getHostAddress(); try { System.out.println(ip+" connected....."); //通过客户端的读取流读取数据 InputStream in=s.getInputStream(); //文件保存路径 File dir =new File("C:\\Users\\asus\\Desktop"); //文件名 File file=new File(dir,ip+".jpg"); //判断文件是否存在 while(file.exists()) { file=new File(dir,ip+"("+(count++)+").jpg"); } //将数据写入到指定文件中 FileOutputStream fos=new FileOutputStream(file); byte[] buf=new byte[1024]; int len=0; while ((len=in.read(buf))!=-1) { fos.write(buf,0,len); } //将收到图片数据的信息返回给客户端 OutputStream out=s.getOutputStream(); out.write("上传成功!".getBytes()); fos.close();//关流 s.close(); } catch (Exception e) { throw new RuntimeException(ip+"图片上传失败"); } } }
练习二:
import java.io.*; import java.net.*; //客户端 class LoginClient { public static void main(String[] args) throws Exception { //创建服务 Socket s=new Socket("localhost",10000); //键盘录入 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); //用Socket服务输出流写入数据 PrintWriter out =new PrintWriter(s.getOutputStream(),true ); //接收服务器返回的信息 BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream())); String line=null; for(int x=0;x<3;x++) { line=br.readLine();//读取键盘录入 if (line==null) { break;//如果键盘没有输入,则直接结束 } out.println(line);//将数据写入流中 String info=in.readLine();//读取返回信息 System.out.println(info); if (info.contains("欢迎"))//--------------- { break;//如果登录成功,就跳出循环 } } br.close();//关流 s.close(); } } //服务端 class LoginServer { public static void main(String [] args)throws Exception { //创建服务,监听端口 ServerSocket ss=new ServerSocket(10000); while (true) { //获取客户端对象 Socket s=ss.accept(); //客户端执行线程 new Thread(new LoginThread(s)).start(); } //ss.close(); } } //利用多线程实现并发登录 class LoginThread implements Runnable { private Socket s; LoginThread(Socket s) { this.s=s; } public void run() { //获取客户端ip String ip=s.getInetAddress().getHostAddress(); System.out.println(ip+" connected....."); try { for (int x=0;x<3 ;x++ ) { //通过客户端的读取流读取数据 BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream())); //读取数据库中的数据,这里用文件来表示数据库 BufferedReader br=new BufferedReader(new FileReader("users.txt")); String line=in.readLine();//读取客户端数据 if (line==null)//-------------- { break;//如果客户端没有发送数据,则跳出循环 } String data=null; boolean flag=false;//设置标记 //读取数据库中的用户数据 while ((data=br.readLine())!=null) { if (line.equals(data)) { flag=true;//如果用户存在,则将标记设为true break; } } //将数据写入到指定文件中 PrintWriter out=new PrintWriter(s.getOutputStream(),true); if (flag) { System.out.println(line+",已登陆!"); out.println(line+",欢迎光临!"); break;//----------- } else { System.out.println(line+",尝试登陆!"); out.println(line+",用户名不存在!"); } } s.close();//关流 } catch (Exception e) { throw new RuntimeException("用户登陆失败"); } } }
- 黑马程序员-java基础 网络编程
- 黑马程序员---java基础之网络编程
- 黑马程序员 Java基础 ---> 网络编程
- 黑马程序员:Java基础总结----网络编程
- 黑马程序员 java基础回顾---网络编程
- <<黑马程序员>>java基础之网络编程
- 黑马程序员Java基础__网络编程
- 黑马程序员-Java基础-网络编程
- 黑马程序员--java基础--网络编程
- 黑马程序员--Java基础--11网络编程
- 黑马程序员--Java基础总结---网络编程
- 黑马程序员-java基础-网络编程
- 黑马程序员 Java基础 网络编程
- 黑马程序员---java基础之网络编程
- 黑马程序员--JAVA基础之网络编程
- 黑马程序员--Java基础--GUI、网络编程
- 黑马程序员-----java基础网络编程<一>
- 黑马程序员--Java基础之网络编程
- iPhone开发UI组件UIDatePickerView的预习
- JSP学习 --- servlet的生命周期
- 运用bootstrap框架写的后台模板
- 【AHOI2012】【BZOJ2823】信号塔
- java设计6大设计原则
- 黑马程序员------Java基础-----网络编程
- iPhone开发之UITableView的小试牛刀 利用MVC模式从plist文件读取数据并字典转模型的格式实现
- testlink使用
- HDU 4609(3-idiots-FFT+dp)
- Ubuntu闪屏
- Windows 平台repo下载及使用repo下载代码
- Ping命令的使用
- php写博客的平台
- 死锁