Java之网络编程基础

举报
芝麻粒儿 发表于 2021/08/05 01:57:45 2021/08/05
【摘要】 推荐资源站:https://zhimalier.com/ 前天对java网络基础进行了以下总结,相信会有很多不足之处!请大牛多多指导,以寻求更好的进步!  在此之前,先说一说基础知识,个人对概念性的知识不是太感冒,但是不了解的话会很坑的。所以喽,还是总结看看! 一、网络的基本概念 1、计算机网络,说白了就是把分布在不同地区的计算机通过线等设备链接起来...

推荐资源站:https://zhimalier.com/

前天对java网络基础进行了以下总结,相信会有很多不足之处!请大牛多多指导,以寻求更好的进步!  在此之前,先说一说基础知识,个人对概念性的知识不是太感冒,但是不了解的话会很坑的。所以喽,还是总结看看!

一、网络的基本概念

1、计算机网络,说白了就是把分布在不同地区的计算机通过线等设备链接起来,形成一个大规模的网络系统,从而达到信息的传递。

2、网络体系:国际化标准组织ISO在1978年提出了OSI(Open System Interconnection)模型,中文名是开放系统互联参考模式,它把网络分为了7层物理层、数据链路层、网络层、传输层、会话层、表示层、应用层


网络编程额三要素:IP地址、端口号、通信协议
      IP地址(IP Address)
      每台主机都必须有一个唯一的,因特网的IP地址具有全球唯一性!
      IP地址IP地址 = 网络ID +主机ID
      网络ID:标识计算机或网络设备所在的网段
      主机ID:标识特定主机或网络设备
      格式:int型、 32位、由4个8位二进制数组成
端口号
      Ip地址其实就是方便找到你想联系的电脑,而端口号则标明的是该计算机的程序应用。他是抽象的软件结构。端口号可以从0到65535,通常分为3类:
*、公认端口(Well Known Ports):从0到1023,它们紧密绑定(Binding)一些服务。
*、注册端口(Registered Ports):从1024到49151。它们松散地绑定一些服务。
*、动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535,这些端口是应用程序使用的动态端口,应用程序一般不会主动使用这些端口。


两类传输通信协议

1、TCP是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个 socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送 或接收操作。

2、UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
TCP/IP虽然名字是TCP,但是他的传输层包含TCP和UDP两个协议
    比较:  UDP相当于发短信(有字数限制)
    不需要建立链接
    数据报的大小限制在64K内
    效率高,不安全,容易丢包
    TCP相当于打电话,需要建立链接
    效率相对较低,数据传输安全

 

三次握手 (点名-->签到-->确认)

二、socket套接字的java网络编程
1、TCP对应的是服务器的ServerSocket和客户端的SocketJava中使用Socket完成TCP程序的开发,使用此类可以方便的建立可靠的、双向的、持续性的、点对点的通讯连接

在Socket的程序开发中,服务器端使用ServerSocket等待客户端的连接,对于java的网络程序来讲,每一个客户端都使用一个Socket对象表示。

socket通讯流程:
(1)创建Socket(客户端) ServerSocket(服务端) 
(2)客户端/服务端打开并连接Socket的输入/输出流
(3)按照一定的规则进行读/写操作
(4)关闭Socket相关


  
  1. //实例代码
  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.OutputStream;
  8. import java.io.OutputStreamWriter;
  9. import java.net.Socket;
  10. import java.net.UnknownHostException;
  11. /**
  12. * TCP socket网络编程
  13. * 1、服务器serversocket建立一个服务器端,还有一个客户端,两者通过
  14. socket对象建立通道连接起来
  15. * 2、两者可以通过流进行数据传输 如果数据有类型,使用
  16. datainputStream dataoutputStream, object
  17. * 3、实际上数据访问还是通过流实现的,但是两端都是来自网络
  18. * @author Administrator
  19. *
  20. */
  21. public class LoginClient {
  22. //使用字符流发送数据,一定要及时刷新flush,每写一行数据需要 newline
  23. public static void main(String[] args) throws UnknownHostException, IOException {
  24. //1、socket套接字,用来打通通道
  25. Socket s = new Socket("127.0.0.1",8888);//打开了本机上的端口号为8888的程序的通道
  26. //输出流,用来向服务器发送数据
  27. OutputStream os = s.getOutputStream();
  28. InputStream is = s.getInputStream();
  29. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
  30. bw.write("发送第一行内容");
  31. bw.newLine();
  32. bw.write("发送第二行内容");
  33. bw.newLine();
  34. bw.flush();
  35. //2、拿到服务器给出的反馈
  36. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  37. System.out.println(br.readLine());
  38. //3、关闭流
  39. br.close();
  40. bw.close();
  41. is.close();
  42. os.close();
  43. s.close();
  44. }
  45. }
  46. import java.io.BufferedReader;
  47. import java.io.BufferedWriter;
  48. import java.io.IOException;
  49. import java.io.InputStream;
  50. import java.io.InputStreamReader;
  51. import java.io.OutputStream;
  52. import java.io.OutputStreamWriter;
  53. import java.net.ServerSocket;
  54. import java.net.Socket;
  55. /**
  56. * Tcp Socket 双向: 客户端向服务器发送数据,服务器接收到之后给出反馈 模拟登陆
  57. * @author Administrator
  58. *
  59. */
  60. public class LoginServer {
  61. public static void main(String[] args) throws IOException {
  62. // 1、创建serversocket对象,并指定地址和端口号
  63. ServerSocket ss = new ServerSocket(8888);
  64. // 2、使用serversocket拿到 socket对象,socket是一个套接字,连接应用层和传输层,打开通道
  65. Socket s = ss.accept();
  66. // 3、socket对象拿到了访问该服务器的对象的数据
  67. InputStream is = s.getInputStream();
  68. OutputStream os = s.getOutputStream();
  69. // 处理拿到的数据
  70. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  71. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
  72. String name = br.readLine();
  73. String pwd = br.readLine();
  74. System.out.println(name+"\t"+pwd+"登陆服务器");
  75. if (name.equals("bjsxt") && pwd.equals("bjsxt")) {
  76. // 当登陆成功,给用户反馈成功
  77. bw.write("恭喜你登陆成功!!!!");
  78. bw.flush();
  79. } else {
  80. bw.write("账号或密码错误!!!!");
  81. bw.flush();
  82. }
  83. //4、关闭流
  84. bw.close();
  85. br.close();
  86. os.close();
  87. is.close();
  88. s.close();
  89. ss.close();
  90. }
  91. }
  92. //对象流的代码实例
  93. import java.io.Serializable;
  94. /**
  95. * 封装了用户信息
  96. * @author Administrator
  97. *
  98. */
  99. public class User implements Serializable{
  100. String name;//登录账号
  101. String pwd;//密码
  102. int id;//身份标识
  103. public User(String name, String pwd, int id) {
  104. super();
  105. this.name = name;
  106. this.pwd = pwd;
  107. this.id = id;
  108. }
  109. }
  110. import java.io.BufferedReader;
  111. import java.io.BufferedWriter;
  112. import java.io.IOException;
  113. import java.io.InputStream;
  114. import java.io.InputStreamReader;
  115. import java.io.ObjectInputStream;
  116. import java.io.ObjectOutputStream;
  117. import java.io.OutputStream;
  118. import java.io.OutputStreamWriter;
  119. import java.net.Socket;
  120. import java.net.UnknownHostException;
  121. /**
  122. * 基于TCP协议的 socket网络编程 1、服务器serversocket建立一个服务器端,还有一个客户
  123. 端,两者通过socket对象建立通道连接起来
  124. * 2、两者可以通过流进行数据传输 如果数据有类型,使用datainputStream
  125. dataoutputStream, object
  126. * 3、实际上数据访问还是通过流实现的,但是两端都是来自网络
  127. * @author Administrator
  128. *
  129. */
  130. public class LoginClient {
  131. // 使用字符流发送数据,一定要及时刷新flush,每写一行数据需要 newline
  132. public static void main(String[] args) throws UnknownHostException,
  133. IOException {
  134. Socket s = new Socket("127.0.0.1", 8888);
  135. ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
  136. oos.writeObject(new User("望舒", "111111", 1));
  137. // 读取服务器给的反馈
  138. InputStream is = s.getInputStream();
  139. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  140. System.out.println(br.readLine());
  141. // 关闭流
  142. is.close();
  143. oos.close();
  144. s.close();
  145. }
  146. }
  147. import java.io.BufferedOutputStream;
  148. import java.io.BufferedReader;
  149. import java.io.BufferedWriter;
  150. import java.io.IOException;
  151. import java.io.InputStream;
  152. import java.io.InputStreamReader;
  153. import java.io.ObjectInputStream;
  154. import java.io.OutputStream;
  155. import java.io.OutputStreamWriter;
  156. import java.net.ServerSocket;
  157. import java.net.Socket;
  158. /**
  159. * Tcp Socket 双向: 客户端向服务器发送对象,服务器接收到之后给出反馈 模拟登陆
  160. * 利用线程知识 可以多客户端
  161. * @author Administrator
  162. *
  163. */
  164. public class LoginServer {
  165. public static void main(String[] args) throws IOException,
  166. ClassNotFoundException {
  167. // 1、创建一个服务器,指定端口号
  168. ServerSocket ss = new ServerSocket(8888);
  169. boolean flag = true;
  170. while (flag) {
  171. Socket s = ss.accept();
  172. new LoginThread(s).start();
  173. }
  174. ss.close();
  175. }
  176. }
  177. class LoginThread extends Thread {
  178. Socket s = null;
  179. public LoginThread(Socket s) {
  180. this.s = s;
  181. }
  182. @Override
  183. public void run() {
  184. try {
  185. login();
  186. } catch (ClassNotFoundException | IOException e) {
  187. // TODO Auto-generated catch block
  188. e.printStackTrace();
  189. }
  190. }
  191. // 接收客户端信息的方法
  192. public void login() throws IOException, ClassNotFoundException {
  193. ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
  194. User user = (User) ois.readObject(); //向下转型
  195. System.out.println(user.name + "正在登录");
  196. OutputStream os = s.getOutputStream();
  197. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
  198. bw.write("服务端接收成功");
  199. bw.flush();
  200. os.close();
  201. ois.close();
  202. s.close();
  203. }
  204. }


2、UDP对应的是DatagramSocket。
实现流程:
服务器端(server):
1. 构造DatagramSocket实例,指定本地端口。
2. 通过DatagramSocket实例的receive方法接收DatagramPacket.DatagramPacket中间就包含了通信的内容。
3. 通过DatagramSocket的send和receive方法来收和发DatagramPacket.
客户端(client):
1. 构造DatagramSocket实例。
2.通过DatagramSocket实例的send和receive方法发送DatagramPacket报文。
3.结束后,调用DatagramSocket的close方法关闭。


不多说,实例代码:


  
  1. import java.net.DatagramPacket;
  2. import java.net.DatagramSocket;
  3. import java.net.InetAddress;
  4. import java.net.SocketException;
  5. import java.util.Scanner;
  6. /**
  7. * 一对多聊天
  8. *
  9. * @author Administrator
  10. *
  11. */
  12. public class UdpServer {
  13. public static void main(String[] args) throws Exception {
  14. // 服务器
  15. DatagramSocket ds = new DatagramSocket(6666);
  16. Scanner input = new Scanner(System.in);
  17. boolean flag = true;
  18. while (flag) {
  19. // dengdai客户端发送消息
  20. byte bs[] = new byte[1024];
  21. DatagramPacket dp = new DatagramPacket(bs, bs.length);
  22. ds.receive(dp);
  23. // 解析数据
  24. String str = new String(dp.getData(), 0, dp.getLength());
  25. // str xiaomi:string
  26. System.out.println(str);
  27. // 端口号和ip地址不确定
  28. int port = dp.getPort();
  29. InetAddress ia = dp.getAddress();
  30. System.out.println(ia.getHostAddress());
  31. String msg = input.next();
  32. // 把消息发送给客户端
  33. DatagramPacket dp1 = new DatagramPacket(msg.getBytes(),
  34. msg.getBytes().length, ia, port);
  35. ds.send(dp1);
  36. }
  37. ds.close();
  38. }
  39. }
  40. import java.net.DatagramPacket;
  41. import java.net.DatagramSocket;
  42. import java.net.InetAddress;
  43. import java.net.SocketException;
  44. import java.util.Scanner;
  45. public class UdpClient {
  46. public static void main(String[] args) throws Exception {
  47. // 1、创建一个客户端 并指定端口
  48. DatagramSocket ds = new DatagramSocket(8881);
  49. boolean flag = true;
  50. while (flag) {
  51. // 2、准备数据
  52. Scanner input = new Scanner(System.in);
  53. String str = input.next();
  54. str = "客户端说:"+str;
  55. //结束客户端
  56. if(str.equals("exit") || str.equals("quit")){
  57. break; //打断循环
  58. //continue: 打断当前这次循环执行下一次
  59. //return 结束方法
  60. }
  61. // 3、打包数据
  62. DatagramPacket dp = new DatagramPacket(str.getBytes(),
  63. str.getBytes().length,
  64. InetAddress.getByName("192.168.1.218"), 8888);
  65. // 4、发送数据
  66. ds.send(dp);
  67. // 5、接收服务器端的反馈
  68. byte[] buf = new byte[1024];
  69. DatagramPacket dp1 = new DatagramPacket(buf, buf.length);
  70. ds.receive(dp1);
  71. System.out.println("服务器说:" + new String(dp1.getData()));
  72. // 6、关闭客户端
  73. }
  74. ds.close();
  75. }
  76. }
  77. //实例二:发送文件
  78. import java.io.BufferedOutputStream;
  79. import java.io.FileOutputStream;
  80. import java.io.IOException;
  81. import java.net.DatagramPacket;
  82. import java.net.DatagramSocket;
  83. import java.net.SocketException;
  84. /**
  85. * 通过udp传递文件
  86. * @author Administrator
  87. *
  88. */
  89. public class UdpServer {
  90. public static void main(String[] args) {
  91. DatagramSocket ds = null;
  92. boolean flag = true;
  93. try {
  94. BufferedOutputStream bos = new BufferedOutputStream(
  95. new FileOutputStream("e:\\xiaomiyanzhao.gif", true));
  96. ds = new DatagramSocket(6666);
  97. // 等待接收数据
  98. byte[] bs = new byte[2000];
  99. while (flag) {
  100. DatagramPacket dp = new DatagramPacket(bs, 0, bs.length);
  101. // 把数据读取到数据报中
  102. ds.receive(dp);
  103. // 输出流输出数据
  104. bos.write(dp.getData(),0,dp.getLength());
  105. }
  106. bos.close();
  107. } catch (SocketException e) {
  108. // TODO Auto-generated catch block
  109. e.printStackTrace();
  110. } catch (IOException e) {
  111. // TODO Auto-generated catch block
  112. e.printStackTrace();
  113. } finally {
  114. ds.close();
  115. }
  116. }
  117. }
  118. import java.io.BufferedInputStream;
  119. import java.io.FileInputStream;
  120. import java.io.IOException;
  121. import java.net.DatagramPacket;
  122. import java.net.DatagramSocket;
  123. import java.net.InetAddress;
  124. import java.net.SocketException;
  125. public class UdpClient {
  126. // 客户端,用来发送文件
  127. public static void main(String[] args) throws IOException {
  128. DatagramSocket ds = new DatagramSocket(8888);
  129. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
  130. "d:\\5.gif"));
  131. byte bs[] = new byte[1024];
  132. int len;
  133. while ((len = bis.read(bs)) != -1) {
  134. DatagramPacket dp = new DatagramPacket(bs, len,
  135. InetAddress.getByName("192.168.1.218"), 6666);
  136. ds.send(dp);
  137. }
  138. System.out.println("发送成功-----》");
  139. bis.close();
  140. ds.close();
  141. }
  142. }


说了这么多 还是自己敲代码来的实在!!  先到这不写了,敲代码去!!

 

 

 

 

文章来源: zhima.blog.csdn.net,作者:芝麻粒儿,版权归原作者所有,如需转载,请联系作者。

原文链接:zhima.blog.csdn.net/article/details/52073792

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。