Java SE day21_网络编程

  • 如果一个类没有构造方法:
    • 案例(UDP的Socket)
    • 案例(键盘输入接受)
    • 案例(多线程聊天)
  • TCP连接
    • 案例(阻塞)
    • 案例(键盘录入-输出控制台)
    • 案例(多线程Scket)

如果一个类没有构造方法:

  • A:成员全部是静态的(Math,Arrays,Collections)

  • B:单例设计模式(Runtime)

  • C:类中有静态方法返回该类的对象(InetAddress)

     class Demo {private Demo(){}public static Demo getXxx() {return new Demo();}}
    

看InetAddress的成员方法:

  • public static InetAddress getByName(String host):根据主机名或者IP地址的字符串表示得到IP地址对象
package cn.itcast_01;import java.net.InetAddress;
import java.net.UnknownHostException;/** 如果一个类没有构造方法:* A:成员全部是静态的(Math,Arrays,Collections)* B:单例设计模式(Runtime)* C:类中有静态方法返回该类的对象(InetAddress)*        class Demo {*           private Demo(){}* *             public static Demo getXxx() {*              return new Demo();*             }*      }* * 看InetAddress的成员方法:* public static InetAddress getByName(String host):根据主机名或者IP地址的字符串表示得到IP地址对象*/
public class InetAddressDemo {public static void main(String[] args) throws UnknownHostException {// public static InetAddress getByName(String host)// InetAddress address = InetAddress.getByName("liuyi");// InetAddress address = InetAddress.getByName("192.168.12.92");InetAddress address = InetAddress.getByName("192.168.12.63");// 获取两个东西:主机名,IP地址// public String getHostName()String name = address.getHostName();// public String getHostAddress()String ip = address.getHostAddress();System.out.println(name + "---" + ip);}
}

协议:
通信的规则

UDP:把数据打包数据有限制不建立连接速度快不可靠TCP:建立连接通道数据无限制速度慢可靠

UDP协议接收数据:

  • A:创建接收端Socket对象
  • B:创建一个数据包(接收容器)
  • C:调用Socket对象的接收方法接收数据
  • D:解析数据包,并显示在控制台
  • E:释放资源

案例(UDP的Socket)

package cn.itcast_02;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/** UDP协议接收数据:* A:创建接收端Socket对象* B:创建一个数据包(接收容器)* C:调用Socket对象的接收方法接收数据* D:解析数据包,并显示在控制台* E:释放资源*/
public class ReceiveDemo {public static void main(String[] args) throws IOException {// 创建接收端Socket对象// DatagramSocket(int port)DatagramSocket ds = new DatagramSocket(10086);// 创建一个数据包(接收容器)// DatagramPacket(byte[] buf, int length)byte[] bys = new byte[1024];int length = bys.length;DatagramPacket dp = new DatagramPacket(bys, length);// 调用Socket对象的接收方法接收数据// public void receive(DatagramPacket p)ds.receive(dp); // 阻塞式// 解析数据包,并显示在控制台// 获取对方的ip// public InetAddress getAddress()InetAddress address = dp.getAddress();String ip = address.getHostAddress();// public byte[] getData():获取数据缓冲区// public int getLength():获取数据的实际长度byte[] bys2 = dp.getData();int len = dp.getLength();String s = new String(bys2, 0, len);System.out.println(ip + "传递的数据是:" + s);// 释放资源ds.close();}
}
----------------------------------------------------------
package cn.itcast_02;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/** UDP协议发送数据:* A:创建发送端Socket对象* B:创建数据,并把数据打包* C:调用Socket对象的发送方法发送数据包* D:释放资源*/
public class SendDemo {public static void main(String[] args) throws IOException {// 创建发送端Socket对象// DatagramSocket()DatagramSocket ds = new DatagramSocket();// 创建数据,并把数据打包// DatagramPacket(byte[] buf, int length, InetAddress address, int port)// 创建数据byte[] bys = "hello,udp,我来了".getBytes();// 长度int length = bys.length;// IP地址对象InetAddress address = InetAddress.getByName("192.168.12.92");// 端口int port = 10086;DatagramPacket dp = new DatagramPacket(bys, length, address, port);// 调用Socket对象的发送方法发送数据包// public void send(DatagramPacket p)ds.send(dp);// 释放资源ds.close();}
}

案例(键盘输入接受)

package cn.itcast_04;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;/** 多次启动接收端:*         java.net.BindException: Address already in use: Cannot bind*        端口被占用。*/
public class ReceiveDemo {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);// 接收数据ds.receive(dp);// 解析数据String ip = dp.getAddress().getHostAddress();String s = new String(dp.getData(), 0, dp.getLength());System.out.println("from " + ip + " data is : " + s);}// 释放资源// 接收端应该一直开着等待接收数据,是不需要关闭// ds.close();}
}
-----------------------------------------------------------
package cn.itcast_04;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/** 数据来自于键盘录入* 键盘录入数据要自己控制录入结束。*/
public class SendDemo {public static void main(String[] args) throws IOException {// 创建发送端的Socket对象DatagramSocket ds = new DatagramSocket();// 封装键盘录入数据BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String line = null;while ((line = br.readLine()) != null) {if ("886".equals(line)) {break;}// 创建数据并打包byte[] bys = line.getBytes();// DatagramPacket dp = new DatagramPacket(bys, bys.length,// InetAddress.getByName("192.168.12.92"), 12345);DatagramPacket dp = new DatagramPacket(bys, bys.length,InetAddress.getByName("192.168.12.255"), 12345);// 发送数据ds.send(dp);}// 释放资源ds.close();}
}

案例(多线程聊天)

package cn.itcast_05;import java.io.IOException;
import java.net.DatagramSocket;/** 通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了*/
public class ChatRoom {public static void main(String[] args) throws IOException {DatagramSocket dsSend = new DatagramSocket();DatagramSocket dsReceive = new DatagramSocket(12306);SendThread st = new SendThread(dsSend);ReceiveThread rt = new ReceiveThread(dsReceive);Thread t1 = new Thread(st);Thread t2 = new Thread(rt);t1.start();t2.start();}
}
----------------------------------------
package cn.itcast_05;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class ReceiveThread implements Runnable {private DatagramSocket ds;public ReceiveThread(DatagramSocket ds) {this.ds = ds;}@Overridepublic void run() {try {while (true) {// 创建一个包裹byte[] bys = new byte[1024];DatagramPacket dp = new DatagramPacket(bys, bys.length);// 接收数据ds.receive(dp);// 解析数据String ip = dp.getAddress().getHostAddress();String s = new String(dp.getData(), 0, dp.getLength());System.out.println("from " + ip + " data is : " + s);}} catch (IOException e) {e.printStackTrace();}}}
---------------------------------------------
package cn.itcast_05;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class SendThread implements Runnable {private DatagramSocket ds;public SendThread(DatagramSocket ds) {this.ds = ds;}@Overridepublic void run() {try {// 封装键盘录入数据BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String line = null;while ((line = br.readLine()) != null) {if ("886".equals(line)) {break;}// 创建数据并打包byte[] bys = line.getBytes();// DatagramPacket dp = new DatagramPacket(bys, bys.length,// InetAddress.getByName("192.168.12.92"), 12345);DatagramPacket dp = new DatagramPacket(bys, bys.length,InetAddress.getByName("192.168.12.255"), 12306);// 发送数据ds.send(dp);}// 释放资源ds.close();} catch (IOException e) {e.printStackTrace();}}}

TCP连接

  • TCP协议发送数据:
    A:创建发送端的Socket对象
    这一步如果成功,就说明连接已经建立成功了。
    B:获取输出流,写数据
    C:释放资源

  • 连接被拒绝。TCP协议一定要先看服务器。
    java.net.ConnectException: Connection refused: connect

  • TCP协议接收数据:
    A:创建接收端的Socket对象
    B:监听客户端连接。返回一个对应的Socket对象
    C:获取输入流,读取数据显示在控制台
    D:释放资源

package cn.itcast_06;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;/** TCP协议发送数据:* A:创建发送端的Socket对象*         这一步如果成功,就说明连接已经建立成功了。* B:获取输出流,写数据* C:释放资源* * 连接被拒绝。TCP协议一定要先看服务器。* java.net.ConnectException: Connection refused: connect*/
public class ClientDemo {public static void main(String[] args) throws IOException {// 创建发送端的Socket对象// Socket(InetAddress address, int port)// Socket(String host, int port)// Socket s = new Socket(InetAddress.getByName("192.168.12.92"), 8888);Socket s = new Socket("192.168.12.92", 8888);// 获取输出流,写数据// public OutputStream getOutputStream()OutputStream os = s.getOutputStream();os.write("hello,tcp,我来了".getBytes());// 释放资源s.close();}
}
--------------------------------------------------
package cn.itcast_06;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/** TCP协议接收数据:* A:创建接收端的Socket对象* B:监听客户端连接。返回一个对应的Socket对象* C:获取输入流,读取数据显示在控制台* D:释放资源*/
public class ServerDemo {public static void main(String[] args) throws IOException {// 创建接收端的Socket对象// ServerSocket(int port)ServerSocket ss = new ServerSocket(8888);// 监听客户端连接。返回一个对应的Socket对象// public Socket accept()Socket s = ss.accept(); // 侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。// 获取输入流,读取数据显示在控制台InputStream is = s.getInputStream();byte[] bys = new byte[1024];int len = is.read(bys); // 阻塞式方法String str = new String(bys, 0, len);String ip = s.getInetAddress().getHostAddress();System.out.println(ip + "---" + str);// 释放资源s.close();// ss.close(); //这个不应该关闭}
}

案例(阻塞)

package cn.itcast_07;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class ClientDemo {public static void main(String[] args) throws IOException {// 创建客户端Socket对象Socket s = new Socket("192.168.12.92", 9999);// 获取输出流OutputStream os = s.getOutputStream();os.write("今天天气很好,适合睡觉".getBytes());// 获取输入流InputStream is = s.getInputStream();byte[] bys = new byte[1024];int len = is.read(bys);// 阻塞String client = new String(bys, 0, len);System.out.println("client:" + client);// 释放资源s.close();}
}
-----------------------------------------------------
package cn.itcast_07;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDemo {public static void main(String[] args) throws IOException {// 创建服务器Socket对象ServerSocket ss = new ServerSocket(9999);// 监听客户端的连接Socket s = ss.accept(); // 阻塞// 获取输入流InputStream is = s.getInputStream();byte[] bys = new byte[1024];int len = is.read(bys); // 阻塞String server = new String(bys, 0, len);System.out.println("server:" + server);// 获取输出流OutputStream os = s.getOutputStream();os.write("数据已经收到".getBytes());// 释放资源s.close();// ss.close();}
}

案例(键盘录入-输出控制台)

package cn.itcast_08;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;/** 客户端键盘录入,服务器输出到控制台*/
public class ClientDemo {public static void main(String[] args) throws IOException {// 创建客户端Socket对象Socket s = new Socket("192.168.12.92", 22222);// 键盘录入数据BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 把通道内的流给包装一下BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line = null;while ((line = br.readLine()) != null) {// 键盘录入数据要自定义结束标记if ("886".equals(line)) {break;}bw.write(line);bw.newLine();bw.flush();}// 释放资源// bw.close();// br.close();s.close();}
}
----------------------------------------------------------------
package cn.itcast_08;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDemo {public static void main(String[] args) throws IOException {// 创建服务器Socket对象ServerSocket ss = new ServerSocket(22222);// 监听客户端连接Socket s = ss.accept();// 包装通道内容的流BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));String line = null;while ((line = br.readLine()) != null) {System.out.println(line);}// br.close();s.close();// ss.close();}
}

案例(多线程Scket)

package cn.itcast_13;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class UploadServer {public static void main(String[] args) throws IOException {// 创建服务器Socket对象ServerSocket ss = new ServerSocket(19191);// 监听客户端连接Socket s = ss.accept();// 封装通道内流BufferedInputStream bis = new BufferedInputStream(s.getInputStream());// 封装图片文件BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mn.jpg"));byte[] bys = new byte[1024];int len = 0;while ((len = bis.read(bys)) != -1) {bos.write(bys, 0, len);bos.flush();}// 给一个反馈OutputStream os = s.getOutputStream();os.write("图片上传成功".getBytes());bos.close();s.close();}
}
----------------------------------------------------------
package cn.itcast_13;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;public class UploadClient {public static void main(String[] args) throws IOException {// 创建客户端Socket对象Socket s = new Socket("192.168.12.92", 19191);// 封装图片文件BufferedInputStream bis = new BufferedInputStream(new FileInputStream("林青霞.jpg"));// 封装通道内的流BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());byte[] bys = new byte[1024];int len = 0;while ((len = bis.read(bys)) != -1) {bos.write(bys, 0, len);bos.flush();}s.shutdownOutput();// 读取反馈InputStream is = s.getInputStream();byte[] bys2 = new byte[1024];int len2 = is.read(bys2);String client = new String(bys2, 0, len2);System.out.println(client);// 释放资源bis.close();s.close();}
}
----------------------------------------------------
package cn.itcast_15;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;public class UserThread implements Runnable {private Socket s;public UserThread(Socket s) {this.s = s;}@Overridepublic void run() {try {// 封装通道内的流BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));// 封装文本文件// BufferedWriter bw = new BufferedWriter(new// FileWriter("Copy.java"));// 为了防止名称冲突String newName = System.currentTimeMillis() + ".java";BufferedWriter bw = new BufferedWriter(new FileWriter(newName));String line = null;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();s.close();} catch (IOException e) {e.printStackTrace();}}}

Java SE day21_网络编程相关推荐

  1. Java se:网络编程

    概述 用Java语言实现计算机间数据的信息传递和资源共享 参考模型: OSI参考模型 TCP/IP参考模型 网络编程三要素 IP地址: 计算机的在网络中的标识 点分十进制标识法:4个字节,每个字节采用 ...

  2. JAVA.SE Socket网络编程

    文章目录 1.网络编程入门 1.1软件架构介绍 1.2互联网通信协议 1.3网络编程的三要素 2.TCP通信 2.1通信分为客户端与服务器 2.2 socket的介绍与使用 2.3servletSoc ...

  3. Java SE:浅析网络编程

    目录 一. 软件结构 二. 网络编程三大要素 2.1 IP地址和域名 2.1.1 IP地址 2.1.2 域名 2.2 端口号 2.3 网络协议 三. TCP与UDP协议 3.1 UDP协议 3.2 T ...

  4. Java学习笔记-网络编程

    Java提供了网络编程,并且在实际中有着大量运用 网络编程 网络编程概述 网络模型 OSI参考模型 TCP/IP参考模型 网络通讯要素 IP地址 端口号 传输协议 网络参考模型 网络通讯要素 IP地址 ...

  5. Java进阶之网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  6. 【java笔记】网络编程概述

    [java笔记]TCP通信程序_m0_52043808的博客-CSDN博客 [java笔记]网络编程:文件上传案例_m0_52043808的博客-CSDN博客 网络编程: 在一定协议下,实现两台计算机 ...

  7. 学习Java第十九天(一):1、Java中的网络编程

    1.Java中的网络编程 什么是网络? 在计算机领域中网络是信息传输,接收共享的虚拟平台,通过它把各个点,面,体的联系到一起,从而实现这些资源的共享. 作用:信息传输,资源共享 有点:资源共享免费 O ...

  8. Java之HTTP网络编程(下篇:网页浏览器程序设计)

    目录 一.本篇简介 二.URL类 三.基于URL类的网页下载 1.发送按钮 2.接收数据的多线程 四.URL网页下载客户端 五.编写web浏览器 1.WebEngine类 2.WebView类 3.W ...

  9. java程序设计之网络编程基础教程_Java程序设计之网络编程基础教程

    基本信息 书名:Java程序设计之网络编程基础教程(21世纪高等学校计算机基础实用规划教材) :43.50元 作者:李芝兴 主编 出版社:清华大学出版社 出版日期:2012-12-1 ISBN:978 ...

最新文章

  1. 升维:ValueError: all the input arrays must have same number of dimensions,
  2. 利用SQL索引提高查询速度
  3. 关于kthreadd
  4. 【计算理论】计算复杂性 ( 两个带子的图灵机的时间复杂度 )
  5. 通过设计绿色数据中心寻求循环经济
  6. hdu 1086 线段相交
  7. python会不会出4_无极4网人生苦短,Python会不会被取代?国外网友
  8. [源码学习]--UGUI
  9. cad批量选择相同块_在CAD中如何快速选择相同或类似的图形、图块?
  10. java判断字符串长度_JAVA 判断字符长度
  11. 路畅畅云固件升级教程_【图】E-Link功能/智能语音 路畅畅云+车载导航评测_汽配中国网...
  12. html超链接访问前颜色,html超链接颜色设置
  13. “AI复活了我的妻子,但我决定跟她说再见了”
  14. python窗口截图快捷键_python 自定义截图快捷键
  15. The JSP specification requires that an attribute name is preceded by whitespace 解决
  16. alexnet 模型详解以及模型的可视化
  17. html ppt在线浏览,怎么在网页中在线浏览PPT文档?
  18. 三维管廊大规模实时渲染方案
  19. 月薪30K的运维工程师面试宝典(面试必备干货)
  20. version libmysqlclient_18 not defined in file libmysqlclient.so.18 with link time reference

热门文章

  1. PANSS 阳性与阴性症状量表
  2. 基于POA搭建ETH联盟链
  3. 莫凡的python_周莫凡python
  4. 质量管理-----解决问题A3报告写法
  5. 判断文件夹是否存在的方法
  6. 你又不杀狼人,何必非要银弹?
  7. POJ 2431 Expedition(贪心+优先队列)
  8. Web Service技术的SOAP实现
  9. 阿贝不变量等三个重要公式的推导
  10. java学习笔记——springmvc 之 数据自定义转换器 数据格式化 JSR303数据校验返回与接收JSON(@RequestBody 和 @ResponseBody)