黑马程序员——java基础--网络编程
2015-05-17 08:08
423 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
五、网络编程
五、网络编程
1. InetAddress对象
import java.net.*; class IPDemo { public static void main(String[] args) throws Exception { //InetAddress i = InetAddress.getLocalHost(); //sop(i.toString()); //sop(i.getHostAddress()); //sop(i.getHostName()); InetAddress ia = InetAddress.getByName("www.baidu.com"); sop(ia.getHostAddress()); sop(ia.getHostName()); } public static void sop(Object obj) { System.out.println(obj); } }
2. 发送端与接收端socket通信
import java.net.*; import java.util.*; import java.text.*; /* 需求:通过udp传输方式将一段文字数据发送出去 思路: 1,建立udpsocket服务 2,提供数据并将数据封装到数据包中 3,通过socket服务的发送功能,将数据包发出 4,关闭资源 */ class UdpSend { public static void main(String[] args) throws Exception { //1,创建udp服务,通过DatagramSocket对象 DatagramSocket ds = new DatagramSocket(12135); while (true) { Scanner sc = new Scanner(System.in); String s = sc.next(); //2,确定数据,并封装成数据包 byte[] buf = s.getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("169.254.225.241"),10258); //3,通过socket服务,将已有数据包发出去,通过send服务。 ds.send(dp); //4,关闭资源。 } } } /* 定义一个应用程序,用于接udp协议收数据并处理。 定义udpsocket服务,通常会监听一个端口,其实就是给这个网络应用程序定义一个数字标示 方便于明确哪些数据过来应用程序可以处理 思路: 1,定义udpsocket服务。 2,定义一个数据包,因为要存储接收到的字节数据,因为数据包中有更多功能可以提取字节数据中的不同信息 3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中 4,通过数据包对象的特有功能,将这些不同的数据取出打印在控制台上 5,关闭资源 */ class Udprece { public static void main(String[] args) throws Exception { //1,创建udp socket,建立端点。 DatagramSocket ds = new DatagramSocket(10258);//指定端口号 //定义数据包,用于存储数据 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); //通过服务的receive方法收到数据存入数据包中 while (true) { ds.receive(dp); //4,通过数据包的方法获取数据 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); sop(sdf.format(d)); int port = dp.getPort(); sop(ip+":"+data); } } public static void sop(Object obj) { System.out.println(obj); } }
3. Chat聊天程序(UDP协议)
/* 编写一个聊天程序 收数据和发数据同时执行 需要用到多线程技术 */ import java.io.*; import java.net.*; import java.text.*; import java.util.*; class Send implements Runnable { private DatagramSocket ds; Send(DatagramSocket ds) { this.ds = ds; } public void run() { try { BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); String line = null; while ((line=bufr.readLine())!=null) { if("88".equals(line)) break; byte[] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length ,InetAddress.getByName("169.254.225.241"),10258); ds.send(dp); } } catch (IOException e) { throw new RuntimeException("发送信息失败"); } } } class Rece implements Runnable { private DatagramSocket ds; Rece(DatagramSocket ds) { this.ds=ds; } public void run() { try { while (true) { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); //通过服务的receive方法收到数据存入数据包中 ds.receive(dp); //4,通过数据包的方法获取数据 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); sop(sdf.format(d)); int port = dp.getPort(); sop(ip+":"+data); } } catch (IOException e) { throw new RuntimeException("接收信息失败"); } } public static void sop(Object obj) { System.out.println(obj); } } class ChatDemo { public static void main(String[] args) throws Exception { DatagramSocket sendSocket = new DatagramSocket(); DatagramSocket receSocket = new DatagramSocket(10258); new Thread(new Send(sendSocket)).start(); new Thread(new Rece(receSocket)).start(); } }
4. TCP协议
/* 演示tcp传输 1,tcp分客户端和服务端 2,客户端对应的对象是Socket 服务端对应的对象是服务端 */ /* 客户端 通过查阅socket对象,发现在该对象监理师,就可以去连接指定主机 因为tcp是面向连接的,所以在建立socket服务时 就要有服务端存在,并连接成功,形成通路后,在该通道进行数据传输 //需求:给服务端发送一个文本数据 步骤 1,创建Socket服务并指定要连接的主机和端口 */ import java.io.*; import java.net.*; class TcpClient { public static void main(String[] args) throws Exception { //创建客户端socket服务,指定目的主机和端口 Socket s = new Socket("169.254.225.241",10003); //为了发送数据,应该获取socket流中的输出流 OutputStream os = s.getOutputStream(); os.write("huanghaihahahahaha".getBytes()); //获取socket流中的输入流,将服务器反馈的数据获取到,并打印 InputStream is = s.getInputStream(); byte[] buf = new byte[1024]; int len = is.read(buf); sop(new String(buf,0,len)); s.close(); } public static void sop(Object obj) { System.out.println(obj); } } /* 需求:定义端点的接收数据并打印在控制台上 服务端: 1,建立服务端的socket服务,ServerSocket对象 并监听一个端口。 2,获取连接过来的客户端对象。 通过ServerSocket的accept()方法,所以这个方法是阻塞式的 3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据 并打印在控制台 4,关闭服务端。(可选) */ class TcpServer { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(10003); Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); sop(ip+".....connected"); InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); sop(new String(buf,0,len)); OutputStream os = s.getOutputStream(); Thread.sleep(10000); os.write("传输成功".getBytes()); s.close(); } public static void sop(Object obj) { System.out.println(obj); } }
5.客户端服务端程序
/* 需求:建立一个文本转换服务器 客户端给服务端发送文本,服务端会将文本转换成大写再返回给客户端 而且客户端可以不断的进行文本转换,当客户端输入over转换结束 */ import java.io.*; import java.net.*; import java.util.*; class Client { public static void main(String[] args) throws Exception { Socket s = new Socket("169.254.225.241",10005); while (true) { OutputStream os = s.getOutputStream(); Scanner sc = new Scanner(System.in); String str = sc.next(); if ("over".equals(str)) break; else { os.write(str.getBytes()); InputStream is = s.getInputStream(); byte[] buf = new byte[1024]; int len = is.read(buf); sop("收到服务器返回值:"+new String(buf,0,len)); } } s.close(); } public static void sop(Object obj) { System.out.println(obj); } } class Server { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(10005); Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); sop(ip+"已连接!!"); while (true) { InputStream is = s.getInputStream(); byte[] buf = new byte[1024]; int len = is.read(buf); OutputStream os = s.getOutputStream(); os.write((new String(buf,0,len).toUpperCase()).getBytes()); sop("已返回数据!!"); } } public static void sop(Object obj) { System.out.println(obj); } }
6.文件上传服务器与客户端代码
class Server { public static void main(String[] args) { ServerSocket ss = new ServerSocket(10086); while (true) { Socket s = ss.accept(); new Thread(new ServerThread(s)).start(); } } } class ServerThread implements Runnable { private Socket s; ServerThread(Socket s) { this.s = s; } public void run() { int count = 0; String ip = s.getInetAddress().getHostAddress(); try { System.out.println(ip+"...connected"); InputStream in = s.getInputStream(); File file = new File(ip+"("+(count)+")"+".jpg"); while(file.exists()) file = new File(ip+"("+(count++)+")"+".jpg"); FileOutputStream fos = new FileOutputStream("server.bmp"); 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 () { throw new RuntimeException(ip+"上传失败"); } } } class Client { public static void main(String[] args) { if(args.length!=1) { System.out.println("请选择一个文件"); return; } File file = new File(args[0]); if(! d65b (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("",10086); FileInputStream fis = new FileInputStream(file); OutputStream out = s.getOutputStream(); byte[] buf = new byte[1024]; int len = 0; while ((len=fis.read(buf))!=-1) { out.write(buf,0,len); } //告诉服务器数据已写完 s.shutdownOutput(); InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; } }
7. URL
方法摘要 | |
boolean | equals(Object obj) 比较此 URL 是否等于另一个对象。 |
String | getAuthority() 获取此 URL 的授权部分。 |
Object | getContent() 获取此 URL 的内容。 |
Object | getContent(Class[] classes) 获取此 URL 的内容。 |
int | getDefaultPort() 获取与此 URL 关联协议的默认端口号。 |
String | getFile() 获取此 URL 的文件名。 |
String | getHost() 获取此 URL 的主机名(如果适用)。 |
String | getPath() 获取此 URL 的路径部分。 |
int | getPort() 获取此 URL 的端口号。 |
String | getProtocol() 获取此 URL 的协议名称。 |
String | getQuery() 获取此 URL 的查询部分。 |
String | getRef() 获取此 URL 的锚点(也称为“引用”)。 |
String | getUserInfo() 获取此 URL 的 userInfo 部分。 |
int | hashCode() 创建一个适合哈希表索引的整数。 |
URLConnection | openConnection() 返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。 |
URLConnection | openConnection(Proxy proxy) 与 openConnection() 类似,所不同是连接通过指定的代理建立;不支持代理方式的协议处理程序将忽略该代理参数并建立正常的连接。 |
InputStream | openStream() 打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。 |
boolean | sameFile(URL other) 比较两个 URL,不包括片段部分。 |
protected void | set(String protocol, String host, int port, String file, String ref) 设置 URL 的字段。 |
protected void | set(String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref) 设置 URL 的指定的 8 个字段。 |
static void | setURLStreamHandlerFactory(URLStreamHandlerFactory fac) 设置应用程序的 URLStreamHandlerFactory。 |
String | toExternalForm() 构造此 URL 的字符串表示形式。 |
String | toString() 构造此 URL 的字符串表示形式。 |
URI | toURI() 返回与此 URL 等效的 URI。 |
相关文章推荐
- 黑马程序员Java培训、Android培训_网络编程的基础知识
- 黑马程序员_Java基础第24天_Java网络编程续
- 黑马程序员——Java网络编程基础
- 黑马程序员Java基础之网络编程(net)
- 黑马程序员—11、JAVA基础&网络编程
- 黑马程序员---Java基础--23天(网络编程之一)
- 黑马程序员---Java基础--24天(网络编程之二)
- 黑马程序员-Java语言基础– 网络编程 第23-24天
- 黑马程序员_Java基础_网络编程基础相关
- 黑马程序员_Java基础_网络编程相关小项目
- 黑马程序员-----java基础十九(java之网络编程)
- 黑马程序员_java基础(12)网络编程之UDP
- 黑马程序员_java基础13网络编程 TCP和DNS
- 黑马程序员---java基础之网络编程
- 黑马程序员-java基础学习网络编程2
- 黑马程序员----JAVA基础之GUI可视化编程与枚举&网络编程
- 黑马程序员 java基础<七>--网络编程(1)
- 黑马程序员 java基础<八>--网络编程(2)
- 黑马程序员 java基础之网络编程TCP
- 黑马程序员 java基础之网络编程UDP