Java基础练习题 (7)网络编程
来源:互联网 发布:剑灵天女捏脸数据大全 编辑:程序博客网 时间:2024/05/18 02:57
(1)如何使用Socket和ServerSocket?
- Socket
部分构造方法
Socket()Socket(InetAddress address, int port)Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
Socket 的构造方法中除了无参的构造方法,其他方法都会尝试与给定的服务器地址建立连接,失败会抛出异常。InetAddress 类用来表示一个 ip 地址。
部分方法
bind(SocketAddress bindpoint) //绑定 Socket 到指定的地址connect(SocketAddress endpoint) //连接至指定的服务器getInputStream()getOutputStream()
getInputStream() 跟 getOutputStream() 方法获取的输入输出流可以用来跟服务器通信,比较重要的方法。
- ServerSocket
部分构造方法
ServerSocket()ServerSocket(int port)
可以在创建 ServerSocket 的时候指定监听的端口,也可以在之后绑定。
部分方法
accept()bind(SocketAddress endpoint)
bind() 方法使 ServerSocket 绑定指定地址。
accept() 方法返回一个连接队列中的一个 Socket。
一个很简单的多线程例子
public class App { public static void main(String[] args) { Thread client = new Thread(new Client()); Thread server = new Thread(new Server()); client.start(); server.start(); }}
public class Client implements Runnable { @Override public void run() { Socket client; try { client = new Socket("127.0.0.1", 3666); System.out.println("客户端链接---"); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); Scanner scan = new Scanner(System.in); while(true) { out.write(scan.nextLine() + "\n"); out.flush(); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
public class Server implements Runnable { @Override public void run() { ServerSocket socket; SocketAddress address; try { address = new InetSocketAddress("127.0.0.1", 3666); socket = new ServerSocket(); socket.bind(address); System.out.println("服务端启动服务---> ip: " + socket.getLocalSocketAddress() + " port: " + socket.getLocalPort()); Socket client = socket.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); while(true) { System.out.println("客户端输入---> " + in.readLine()); } } catch (IOException e) { e.printStackTrace(); } }}
(2)如何通过Socket发送和接收文件?
相当于将文件用字节流来传输,跟传文本类似
服务器端代码
ServerSocket socket;SocketAddress address;String filePath = "E:\\demo\\test.txt";File file = new File(filePath);try { BufferedInputStream in = new BufferedInputStream(new FileInputStream(file)); address = new InetSocketAddress("127.0.0.1", 3666); socket = new ServerSocket(); socket.bind(address); System.out.println("服务端启动服务---> ip: " + socket.getLocalSocketAddress() + " port: " + socket.getLocalPort()); Socket client = socket.accept(); System.out.println("客户端连接成功!开始传输---"); DataOutputStream out = new DataOutputStream(client.getOutputStream()); byte[] b = new byte[1024]; while (in.read(b, 0, b.length) != -1) { out.write(b); } out.flush(); System.out.println("传输完成!"); in.close(); out.close(); client.close();} catch (IOException e) { e.printStackTrace();}
客户端代码
Socket client;String filePath = "E:\\demo\\test2.txt";File file = new File(filePath);try { client = new Socket("127.0.0.1", 3666); System.out.println("客户端链接---"); DataInputStream in = new DataInputStream(client.getInputStream()); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file)); byte[] b = new byte[1024]; while (in.read(b, 0, b.length) != -1) { out.write(b); } out.flush(); System.out.println("客户端接收完成!"); in.close(); out.close();} catch (UnknownHostException e) { e.printStackTrace();} catch (IOException e) { e.printStackTrace();}
(3)如何使用URLConnection下载一个文件?
java.net.URLConnection 类是一个抽象类,我们可以通过 URL 类的 openConnection 获取 URLConnection 的实现类。
URLConnection 可以设置不同的请求方式,如常见的 get、post 方法等。头部信息也有很多对应的方法设置,如
- setAllowUserInteraction
- setDoInput
- setDoOutput
- setIfModifiedSince
setUseCaches
还有一个通用的设置方法
setRequestProperty
下载文件时,我们通过 getInputStream() 方法获取输入流,将下载的数据写入文件
一个很简单的例子
public void download(String urlPath, String directory) { URL url; try { url = new URL(urlPath); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.connect(); int fileLength = conn.getContentLength(); String filePath = url.getPath(); String fileName = filePath.substring(filePath.lastIndexOf("/") + 1); System.out.println("文件大小:" + fileLength); File file = new File(directory + File.separator + fileName); if(!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); System.out.println("下载位置:" + file.getPath()); BufferedInputStream bis = new BufferedInputStream(conn.getInputStream()); byte[] b = new byte[1024]; int size = 0; int downloadLength = 0; while ((size = bis.read(b)) != -1) { bos.write(b, 0, size); downloadLength += size; //System.out.println("已下载:" + downloadLength * 100 / fileLength + "%"); //打印下载百分比 } bos.flush(); bos.close(); bis.close(); conn.disconnect(); } catch (MalformedURLException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}
阅读全文
0 0
- Java基础练习题 (7)网络编程
- 基础Java语言编程练习题
- C#网络应用编程基础练习题与答案(一)
- C#网络应用编程基础练习题与答案(二)
- C#网络应用编程基础练习题与答案(三)
- C#网络应用编程基础练习题与答案(一)
- C#网络应用编程基础练习题
- Java基础(网络编程)
- JAVA基础编程练习题--50道
- JAVA基础编程练习题--50道
- java语言程序设计基础篇第一章编程练习题
- 50道JAVA基础编程练习题
- 50道JAVA基础编程练习题
- 50道JAVA基础编程练习题
- 50道Java基础编程练习题
- 50 道 Java 基础编程练习题
- 50道JAVA基础编程练习题
- 50道JAVA基础编程练习题(1)
- 把数据库里的字段值分别加载
- 第一章 shell基本使用(一)
- bzoj 1264: [AHOI2006]基因匹配Match (DP+树状数组)
- android 观察者模式
- 递归函数
- Java基础练习题 (7)网络编程
- 第三天的感想
- 随手记
- 安卓开发-ListView侧拉菜单,置顶等仿QQ侧拉菜单侧拉点击切换图片,侧拉点击事件带上拉加载更多,下拉刷新
- [链分治 重链剖分 FWT] BZOJ 4911 [Sdoi2017]切树游戏
- springMVC controller中方法的返回值类型
- 精灵进程
- 欧拉角与万向节死锁
- 池内亚也--请不要忘记,这张照片中…