1.计算机网络:将分布在不同区域不同地方的多台计算机和网络设备通过线程连接起来组成一套大型系统,来实现计算机之间的信息传递和资源共享的设备.

2.网络编程:编写一个程序来实现网络间信息传递.

网络编程要使用的技术:网络编程+多线程+流

3.网络编程三要素:

3.1:IP:ip地址是每台计算机在网络中唯一标识.在同一个网络中不能有相同ip地址.

在不同网络中,可以有相同ip地址.

本机回环地址:127.0.0.1

查看本机IP:运行->cmd->ipconfig

查看本机是否能与其他计算机连通:运行->cmd->ping ip地址

3.2:端口:应用程序在网络中唯一标识.端口范围:0~65535,其中0-1024之间商品被系统软件占用.

3.3:协议:实现网络间通信的规则.

4.OSI七层模型和TCP/IP四层模型

5.InetAddress:此类表示Internet协议(IP)地址。

public static void main(String[] args) throws UnknownHostException {//获得本机ip地址对象// InetAddress ip1=InetAddress.getLocalHost();InetAddress ip1=InetAddress.getByName("192.168.2.113");System.out.println("本机ip:"+ip1.getHostAddress());System.out.println("主机名:"+ip1.getHostName());InetAddress[] ips=InetAddress.getAllByName("www.baidu.com");for (InetAddress ip2:ips) {System.out.println("百度ip:" + ip2.getHostAddress());}
}

6.TCP网络编程:用的TCP协议.

TCP协议:是一种安全的,面向链接的网络层协议.优点:安全性高(因TCP的客户端与服务器端要经过三次握手才能建立连接,连接后才能互发消息).缺点:效率低.

Socket:客户端套接字(也称为“套接字”)。 套接字是两台机器之间通讯的信使.

ServerSocket:服务器套接字.监听客户端的套接字对象.

6.1:客户端发送消息,服务端接收消息

eg:public static void main(String[] args) throws IOException {//创建套接字对象,第一个参数是服务端IP,第二个参数服务端应用的端口号Socket socket1=new Socket("127.0.0.1",6666);//用套接字对象创建网络输出字节流对象OutputStream os=socket1.getOutputStream();//声明一个变量存发送给服务器的消息String word1="Hello Server!!";//用网络输出流对象将消息通过网络发给服务器os.write(word1.getBytes());System.out.println("客户端发消息给服务器为:"+word1);//关对象os.close();socket1.close();
}public static void main(String[] args) throws IOException {//创建服务器套接字对象ServerSocket ss=new ServerSocket(6666);System.out.println("客户端与服务器正在连接中...");//用服务器套接字对象调用方法监听客户端Socket对象,并声明变量接收客户端SocketSocket socket2=ss.accept();//接收到客户端的Socket对象,就表示客户端与服务器端三次握手成功,建立连接System.out.println("客户端与服务器连接成功!");//用套接字对象获得网络字节读取流InputStream is=socket2.getInputStream();//准备一个数组byte[] b=new byte[1024];//用网络字节读取流对象调用方法接收客户端的消息,返回的是消息的长度,消息的内容存在数组中int len=is.read(b);//将接收客户端的消息,转换为字符串类型String recieveWord1=new String(b,0,len);System.out.println("服务器接收客户端的消息为:"+recieveWord1);//关闭对象is.close();ss.close();
}

6.2:客户端发送消息,服务端回复消息,完成一次聊天

eg:public static void main(String[] args) throws IOException {//创建套接字对象,第一个参数是服务端IP,第二个参数服务端应用的端口号Socket socket1=new Socket("127.0.0.1",6666);//用套接字对象创建网络输出和输入字节流对象OutputStream os=socket1.getOutputStream();InputStream is=socket1.getInputStream();/*客户端发消息给服务器端*///声明一个变量存发送给服务器的消息String word1="Hello Server!!";//用网络输出流对象将消息通过网络发给服务器os.write(word1.getBytes());System.out.println("客户端发消息给服务器为:"+word1);/*客户端接收服务器回复的消息*///声明一个数组byte[] b=new byte[1024];//接收服务器的消息int len=is.read(b);//将接收回复的消息转换为字符串String s2=new String(b,0,len);System.out.println("客户端接收服务器回复消息为:"+s2);//关对象os.close();socket1.close();
}public static void main(String[] args) throws IOException {//创建服务器套接字对象ServerSocket ss=new ServerSocket(6666);System.out.println("客户端与服务器正在连接中...");//用服务器套接字对象调用方法监听客户端Socket对象,并声明变量接收客户端SocketSocket socket2=ss.accept();//接收到客户端的Socket对象,就表示客户端与服务器端三次握手成功,建立连接System.out.println("客户端与服务器连接成功!");//用套接字对象获得网络字节读取和写入流InputStream is=socket2.getInputStream();OutputStream os=socket2.getOutputStream();/*读取客户端的消息*///准备一个数组byte[] b=new byte[1024];//用网络字节读取流对象调用方法接收客户端的消息,返回的是消息的长度,消息的内容存在数组中int len=is.read(b);//将接收客户端的消息,转换为字符串类型String recieveWord1=new String(b,0,len);System.out.println("服务器接收客户端的消息为:"+recieveWord1);/*服务器端回复消息给客户端*///声明一个变量存发送给服务器的消息String word1="Hello Client!!";//用网络输出流对象将消息通过网络发给服务器os.write(word1.getBytes());System.out.println("服务器端回复消息给客户端为:"+word1);//关闭对象is.close();ss.close();
}

6.3:客户端与服务器端一对一循环聊天

eg:public static void main(String[] args) throws IOException {//创建socket对象Socket socket1=new Socket("127.0.0.1",7777);//创建网络字符输出和输入流BufferedWriter w=new BufferedWriter(new OutputStreamWriter(socket1.getOutputStream()));BufferedReader r=new BufferedReader(new InputStreamReader(socket1.getInputStream()));Scanner input=new Scanner(System.in);//循环聊天while (true){/*发消息*///从键盘上接收要发送的消息System.out.println("客户端发送给服务器的消息为:");String sendMess=input.nextLine();//将消息发送给服务器w.write(sendMess);//换行w.newLine();//刷新缓存w.flush();/*接收服务器消息*/String recieveMess=r.readLine();System.out.println("客户端接收服务器的消息为:"+recieveMess);//约定一个结束语来结束聊天if (sendMess.equals("886")||recieveMess.equals("886")){break;}}//关对象socket1.close();
}public static void main(String[] args) throws IOException {//创建服务器的socketServerSocket ss=new ServerSocket(7777);System.out.println("客户端与服务器正在连接中...");//监视客户端,并接收客户端的socketSocket socket1=ss.accept();System.out.println("客户端与服务器连接成功!");//创建网络字符输入和输出流BufferedWriter w=new BufferedWriter(new OutputStreamWriter(socket1.getOutputStream()));BufferedReader r=new BufferedReader(new InputStreamReader(socket1.getInputStream()));Scanner input=new Scanner(System.in);while (true){/*接收客户端消息*/String recieveMess2=r.readLine();System.out.println("服务器接收客户端的消息为:"+recieveMess2);/*回复客户端的消息*///从键盘上接收服务回复给客户端的消息System.out.println("服务器回复客户端的消息为:");String sendMess2=input.nextLine();//将消息发送给客户端w.write(sendMess2);//换行w.newLine();//刷新w.flush();//约定一个结束语来结束聊天if (sendMess2.equals("886")||recieveMess2.equals("886")){break;}}//关对象ss.close();
}

6.4:用TCP实现文件上传

eg:public static void main(String[] args) throws IOException {//创建客户端socketSocket socket2=new Socket("127.0.0.1",8888);//上传的文件File f1=new File("C:\\Users\\sx\\Desktop\\image\\d.jpg");//创建本地读取流InputStream is=new FileInputStream(f1);//创建网络写入流OutputStream os=socket2.getOutputStream();/*先先本地硬盘上的文件读取到程序中再写入到服务器,边读取边写入*///1,先将文件名发送到服务器端os.write(f1.getName().getBytes());//2.将文件内容发送到服务器//准备一个数组byte[] b=new byte[1024];//边读取本地文件边写入服务器int len;while ((len=is.read(b))!=-1){os.write(b,0,len);}System.out.println("上传成功");//3.关对象is.close();os.close();socket2.close();
}public static void main(String[] args) throws IOException {//创建服务器的socketServerSocket ss=new ServerSocket(8888);System.out.println("客户端与服务器正常连接中...");//监视客户端,并接收客户端的socketSocket socket2=ss.accept();System.out.println("客户端与服务器连接成功");//创建网络读取流InputStream is=socket2.getInputStream();/*先读取原文件名*///准备一个数组byte[] b=new byte[1024];//1.第一次读取文件名,将读取的内容存在数组中,返回的是读取的长度int len=is.read(b);String fileName=new String(b,0,len);//创建本地写入流OutputStream os=new FileOutputStream("Day34\\aa\\"+fileName);//将读取的图片内容写入到服务器硬盘上,边读取边写入int len2;while ((len2=is.read(b))!=-1){os.write(b,0,len2);}System.out.println("上传成功");//关对象is.close();os.close();ss.close();
}

7.UDP编程:用udp协议.

udp协议:是一种不安全,无需建立连接的传输效率高的协议.UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内.udp没有服务器端,都是客户端.

DatagramSocket:此类表示用于发送和接收数据报数据包的套接字。(两个网络传消息的信使) .

DatagramPacket:该类表示数据报包。

7.1:客户端1发送的接收一次客户端2的消息

eg:public static void main(String[] args) throws Exception {//创建socket对象,参数是当前这个客户端的端口号DatagramSocket socket1=new DatagramSocket(1111);/*客户端1发送消息给客户端2*///准备要发送的消息byte[] b="恭喜你中了好声音第一等奖".getBytes();//将要发送的消息打成数据发送包,第一个参数要发送的数据,第二个数据的长度,第三个是接收方IP对象,第四个是接收方的端口号DatagramPacket packet1=new DatagramPacket(b,b.length, InetAddress.getByName("127.0.0.1"),2222);//用socket发送数据包socket1.send(packet1);System.out.println(socket1.getLocalPort()+"发送给"+packet1.getPort()+"的消息为:"+new String(b));/*客户端1接收客户端2回复的消息*///准备一个数组byte[] b2=new byte[1024];//构造一个接收包DatagramPacket packet2=new DatagramPacket(b2,b2.length);//用socket接收数据包socket1.receive(packet2);//获得接收的数据String recieveMess=new String(packet2.getData(),0,packet2.getLength());System.out.println(socket1.getLocalPort()+"接收"+packet2.getPort()+"消息为:"+recieveMess);//关对象socket1.close();
}public static void main(String[] args) throws Exception {//创建socket对象,参数是当前客户端的端口号DatagramSocket socket2=new DatagramSocket(2222);/*客户端2接收客户端1的消息*///准备一个数组byte[] b=new byte[1024];//构造一个数据接收包DatagramPacket packet3=new DatagramPacket(b,b.length);//用socket接收数据socket2.receive(packet3);//获得接收的数据String recieveMess=new String(packet3.getData(),0,packet3.getLength());System.out.println(socket2.getLocalPort()+"接收"+packet3.getPort()+"消息为:"+recieveMess);/*客户端2回复客户端1的消息*///准备要回复(发送)的消息byte[] sendMess="到哪里去领奖?".getBytes();//将消息封装数据发送包DatagramPacket packet4=new DatagramPacket(sendMess,sendMess.length, InetAddress.getByName("127.0.0.1"),1111);//用socket将消息发送给客户端1socket2.send(packet4);System.out.println(socket2.getLocalPort()+"回复"+packet4.getPort()+"消息为:"+new String(sendMess));//关流socket2.close();
}

7.2:客户端1与客户端2循环收发消息

eg:/**
*发送消息的线程* @version 1.0* @auth sx* @date 2020/3/26*/
public class SendThread extends Thread {//声明发送方的socket对象DatagramSocket socket1;//声明接收方ip对象InetAddress ip2;//声明接收方端口int port2;/*** 通过构造方法将发送方的socket,接收方ip对象,接收方端口** @param socket1,* @param ip2* @param port2*/public SendThread(DatagramSocket socket1, InetAddress ip2, int port2) {this.socket1 = socket1;this.ip2 = ip2;this.port2 = port2;}@Overridepublic void run() {Scanner input = new Scanner(System.in);try {while (true) {//准备要发送的消息byte[] b = input.next().getBytes();//将要发送的消息打成数据发送包,第一个参数要发送的数据,第二个数据的长度,第三个是接收方IP对象,第四个是接收方的端口号DatagramPacket packet1 = new DatagramPacket(b, b.length, ip2, port2);//用socket发送数据包socket1.send(packet1);System.out.println(socket1.getLocalPort() + "发送给" + packet1.getPort() + "的消息为:" + new String(b));}} catch (Exception e) {e.printStackTrace();}}
}/**
*接收线程* @version 1.0* @auth sx* @date 2020/3/26*/
public class RecieveThread extends Thread{//声明接收方的socketDatagramSocket socket2;/***用构造方法传入接收方的socket*@param socket2*@return*/public RecieveThread(DatagramSocket socket2) {this.socket2 = socket2;}@Overridepublic void run() {try {while (true) {//准备一个数组byte[] b2 = new byte[1024];//构造一个接收包DatagramPacket packet2 = new DatagramPacket(b2, b2.length);//用socket接收数据包socket2.receive(packet2);//获得接收的数据String recieveMess = new String(packet2.getData(), 0, packet2.getLength());System.out.println(socket2.getLocalPort() + "接收" + packet2.getPort() + "消息为:" + recieveMess);}}catch (Exception e){e.printStackTrace();}}
}public static void main(String[] args) throws Exception {//创建socket对象,参数是当前这个客户端的端口号DatagramSocket socket1=new DatagramSocket(1111);//创建发送消息的线程和接收消息的线程SendThread s=new SendThread(socket1, InetAddress.getLocalHost(),2222);RecieveThread r=new RecieveThread(socket1);//启动线程r.start();s.start();
}public static void main(String[] args) throws Exception {//创建socket对象,参数是当前客户端的端口号DatagramSocket socket2=new DatagramSocket(2222);//创建发送消息的线程和接收消息的线程SendThread s=new SendThread(socket2, InetAddress.getLocalHost(),1111);RecieveThread r=new RecieveThread(socket2);//启动线程r.start();s.start();
}

网络编程——TCP网络编程UDP编程相关推荐

  1. 套接字编程-TCP网络编程

    文章目录 套接字地址结构 通用套接字地址数据结构 以太网协议的套接字地址数据结构 Netlink协议套接字地址结构 TCP网络编程 套接字初始化socket() domain type protoco ...

  2. 网络编程-TCP/IP协议栈-UDP/HTTP协议

    UDP协议 UDP协议全称是用户数据报协议,在网络中她与TCP协议一样用于处理数据包,两个协议同处于协议栈的传输层,和TCP不同的是,UDP是一种无连接的协议栈. 因为UDP是无连接的,所以相对来说, ...

  3. linux内核工程导论,Linux内核工程导论–网络:TCP:netlink与tcp_diag编程

    概览 http://m.oschina.net/blog/351007有一个示例程序,但是它用的v1的接口. http://kristrev.github.io/2013/07/26/passive- ...

  4. Python学习笔记(四十六)网络编程(2)— UDP编程

    摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014320049779 ...

  5. 网络编程-TCP/IP协议栈-TCP协议

    TCP协议 TCP协议作用 TCP协议位于协议栈的传输层.当应用层向TCP层发送用于网间传输的,用8字节表示的数据流,TCP则吧数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受到改计算机连 ...

  6. 迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等

    文章目录 网络编程概述 网络通信要素 要素一IP和端口号 要素二网络协议 TCP网络编程 UDP网络编程 URL网络编程 Java网络编程基础 网络编程概述 Java是Internet上的语言,它从语 ...

  7. tcp网络编程客户端和服务端及listen和tcp允许最大连接数

    tcp网络编程 tcp网络编程步骤: 由于tcp传输特点是可靠有连接,那么就有 1.客户端向服务端发送连接请求(SYN), 2.服务端接受请求并向客户端发送(SYN+ACK); 3.客户端向服务端回复 ...

  8. TCP网络编程 [Java]

    TCP网络编程 这里我们通过一个例子来了解什么是TCP网络编程: eg: 问题: -> 从客户端发送文件到服务端,服务端将接受到的客户端发来的文件存储到本地之后并返回一个发送成功给客户端,并关闭 ...

  9. Linux网络编程——原始套接字编程

    Linux网络编程--原始套接字编程 转自:http://blog.csdn.net/tennysonsky/article/details/44676377 原始套接字编程和之前的 UDP 编程差不 ...

最新文章

  1. mysql 一键安装 linux_linux下mysql8 shell脚本一键安装
  2. mysql数据库访问控制_一文总结MySQL数据库访问控制实现原理
  3. script 标签中async 属性和defer 属性作用以及区别?
  4. Redis集群功能概述
  5. linux下makefile
  6. Go进阶(7): JSON 序列化和反序列化
  7. loadrunner中并发数与迭代的区别
  8. 通过查看__cplusplus的值查看编译器的C++标准
  9. CF 717A Festival Organization——斯特林数+递推求通项+扩域
  10. java关闭applet_java – Applet会自动关闭
  11. 剑指offer:斐波那契数列
  12. 这个低代码报表开发平台,操作类似Excel,用好了不需要加班
  13. Xamarin devexpress Grid
  14. 后台管理系统推荐(PHP)
  15. 怎样进入国外的游戏行业工作?
  16. 注册会计师的待遇如何?职业发展怎么样?
  17. 调用百度AI开放平台实现图片文字识别
  18. Gerrit报错:Permission denied (publickey)
  19. gprs模块与服务器通信协议,gprs模块与服务器通信原理分析
  20. 深入理解Amazon Alexa Skill(一)

热门文章

  1. 标题: 第39级台阶
  2. TCP 连接建立 故障排查
  3. 夏皮罗维尔克检验(Shapiro-Wilk test)
  4. 点两下计算机打不开了,双击我的电脑打不开时的解决方法
  5. 如何使用BERT实现中文的文本分类(附代码)
  6. 数据库索引原理 b树
  7. 查找同一批次号中批次号最小的文件名称
  8. 高得帅经典爱情语录(除了最后一句,全部为自创,望大家点点关注,刷一刷阅读量!)
  9. SSH工具连接服务器密钥改成密码登录
  10. IP地址冲突怎么解决