网络编程

文章目录

  • 网络编程
    • TCP协议
    • UDP协议
    • socket(套接字)
    • TCP案例模板:
      • 1.客户端建立链接、服务端准备服务(ip(可省略)、端口)
      • 2.通过socket生成InputStream/OutputStream(准备发送数据)
      • 3.使用InputStream/OutputStream进行发送、接收数据
      • 4.关闭InputStream/OutputStream、socket
    • 对象流
    • 处理多用户问题
    • UDP案例模板
    • 网络编程中一些工具类
      • InetAddress
      • **URL /URLConnection**

ip地址:网络上的唯一标识

ip的组成:32位组成,由4个8位二进制(每一位最大值是255,每一位十进制标识0-255)

192.168.1.100
11000000.10101000.00000001.01100100 二级制不容易记忆,改成是十进制

协议:为了让网络中不同计算机之间能够相互通信而简历的规则、标准、约定

TCP协议

面向连接、可靠的(不丢失、不重复、有序)、基于字节流的传输通信协议。(传输速度相对慢)

UDP协议

无连接的协议。在传输数据之前。客户端和服务器之间不建立和维护链接。提供不可靠的数据传输(速度快)

socket(套接字)

基于TCP协议的网络通信,可以提供双向安全的网络通信。

socket需要借助于数据流(字节流)来完成数据的传递工作:重点

  • 发送数据:OutputStream
  • 接收数据:InputStream

TCP案例模板:

1.客户端建立链接、服务端准备服务(ip(可省略)、端口)

本机默认ip:127.0.0.1/localhost

2.通过socket生成InputStream/OutputStream(准备发送数据)

3.使用InputStream/OutputStream进行发送、接收数据

4.关闭InputStream/OutputStream、socket

服务端(ServerSocket)

package demo01;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class MyServer {public static void main(String[] args) {//        1.准备服务.ip:默认本机127.0.0.1,端口8888ServerSocket serverSocket = null ;Socket socket = null ;InputStream in = null ;BufferedReader reader = null ;OutputStream out = null ;try {serverSocket = new ServerSocket(8888) ;System.out.println("服务器启动");//准备完毕,可以监听客户端请求socket = serverSocket.accept();//一直阻塞,直到有客户端连接System.out.println("服务端检测到客户端连接成功!");//  2.通过socket生成inputstream/outputstream(准备发送数据)//3.使用inputstream/outputstream进行发送、接受数据in = socket.getInputStream();//带缓冲区的字符流(字节流-转换流-字符流)reader = new BufferedReader(new InputStreamReader(in));String info = null ;while(  (info=reader.readLine()) != null       ){System.out.println("I am server,接受到客户端信息是:" + info);    socket.shutdownInput();//服务端做出反馈out = socket.getOutputStream();out.write("welcome  client....".getBytes());socket.shutdownOutput();} catch (IOException e) {e.printStackTrace();}finally{try {// 4.关闭inputstream/outputstream、socketif(reader !=null) reader.close();if(out !=null) out.close();if(in !=null) in.close();if(socket !=null) socket.close();if(serverSocket !=null) serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}
}

客户端(Socket)

package demo01;import java.io.*;
import java.net.Socket;/** Created by 颜群*/
public class MyClient {public static void main(String[] args) {Socket socket = null ;OutputStream out = null ;InputStream in = null ;BufferedReader reader = null ;try {socket = new Socket("127.0.0.1",8888);System.out.println("客户端链接成功!");out = socket.getOutputStream();out.write( "hello server".getBytes()  );socket.shutdownOutput();//接收服务端的反馈in = socket.getInputStream();reader = new BufferedReader(new InputStreamReader(in));String info = null;while(   (info=reader.readLine()) != null ){System.out.println("I am client,接收到的服务端消息:"+info);}socket.shutdownInput();} catch (IOException e) {e.printStackTrace();}finally{try {if(out!=null) out.close();if(in!=null) in.close();if(socket!=null) socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

对象流

网络传递一个对象:

1.将要传递的对象序列化 (对象implements Serializable)

2.使用对象流(ObjectInputSream\ObiectOutputStream)

要传递的对象

package Demo02;import java.io.Serializable;public class Student implements Serializable {private int sid;private String name;private int age;public Student() {}public Student(int sid, String name, int age) {this.sid = sid;this.name = name;this.age = age;}public int getSid() {return sid;}public void setSid(int sid) {this.sid = sid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"sid=" + sid +", name='" + name + '\'' +", age=" + age +'}';}
}

服务端

package Demo02;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class MyServer {public static void main(String[] args) {ServerSocket serverSocket = null;Socket socket = null;InputStream in = null;ObjectInputStream ois = null;try {serverSocket = new ServerSocket(8888);socket = serverSocket.accept();//收客户端发来的对象in = socket.getInputStream();//包装ois = new ObjectInputStream(in);try {Student student = (Student) ois.readObject();System.out.println(student);socket.shutdownInput();} catch (ClassNotFoundException e) {e.printStackTrace();}} catch (IOException e) {e.printStackTrace();} finally {try {if (ois != null) ois.close();if (in != null) in.close();if (socket != null) socket.close();if (serverSocket != null) serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}
}

客户端

package Demo02;import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;public class MyClient {public static void main(String[] args) {Socket socket = null;OutputStream out = null;ObjectOutputStream oos = null;try {socket = new Socket("localhost", 8888);Student student = new Student(1001, "zs", 23);out = socket.getOutputStream();//将输出流编程对象流.装饰模式oos = new ObjectOutputStream(out);oos.writeObject(student);socket.shutdownOutput();} catch (IOException e) {e.printStackTrace();} finally {try {if (oos != null) oos.close();if (out != null) out.close();if (socket != null) socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

处理多用户问题

思路:

客户端:代码不变

服务端:每当有一个客户端,就开启一个新线程去处理(每个线程专门处理一个客户端对象)

要传递的对象

package Demo03;import java.io.Serializable;public class Student implements Serializable {private int sid;private String name;private int age;public Student() {}public Student(int sid, String name, int age) {this.sid = sid;this.name = name;this.age = age;}public int getSid() {return sid;}public void setSid(int sid) {this.sid = sid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"sid=" + sid +", name='" + name + '\'' +", age=" + age +'}';}
}

服务端

package Demo03;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Myserver {public static void main(String[] args) {try {ServerSocket serverSocket = new ServerSocket(8888);while(true) {Socket socket = serverSocket.accept();ServerThread serverThread = new ServerThread(socket);serverThread.start();}} catch (IOException e) {e.printStackTrace();}}
}

服务端线程

package Demo03;import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.Socket;public class ServerThread extends Thread{Socket socket ;public ServerThread(Socket socket){this.socket = socket;}@Overridepublic void run() {InputStream  in =null;ObjectInputStream ois = null;OutputStream out =null;//接收客户端数据try {in = socket.getInputStream();//装饰模式ois = new ObjectInputStream(in);Object  student = (Student)ois.readObject();System.out.println(student);socket.shutdownInput();//返回文字out = socket.getOutputStream();out.write("已经收到".getBytes());} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}finally {try {out.close();ois.close();in.close();socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

客户端

package Demo03;import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;public class MyClient {public static void main(String[] args) {Socket socket = null;OutputStream out = null;ObjectOutputStream oos = null;try {socket = new Socket("localhost", 8888);Student student = new Student(1001, "zs", 23);out = socket.getOutputStream();//将输出流编程对象流.装饰模式oos = new ObjectOutputStream(out);oos.writeObject(student);socket.shutdownOutput();InputStream in = socket.getInputStream();byte[] buf = new byte[100];in.read(buf);System.out.println("接收到服务端返葵"+new String(buf));} catch (IOException e) {e.printStackTrace();} finally {try {if (oos != null) oos.close();if (out != null) out.close();if (socket != null) socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

UDP案例模板

DatagramPacket(数据):封装了数据报、数据长度、目标地址和目标端口

DatagramSocket(收发器):接收和DatapramPacket中封装好的数据

发送

package Demo04;import java.io.IOException;
import java.net.*;/** Created by 颜群*/
public class Send {public static void main(String[] args) {DatagramSocket ds = null ;//创建一个InetAddress对象InetAddress ip = null ;try {ip = InetAddress.getByName("127.0.0.1");String msg = "helloserver.." ;DatagramPacket dp = new DatagramPacket(msg.getBytes(),msg.length(),ip,9999) ;ds = new DatagramSocket() ;ds.send(  dp );} catch (UnknownHostException e) {e.printStackTrace();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{ds.close();}}
}

接收

 package Demo04;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class Receive {public static void main(String[] args) {byte[] data = new byte[64];//准备接受数据的对象DatagramPacket dp = new DatagramPacket(data, data.length);DatagramSocket ds =null;//接收数据try {ds = new DatagramSocket(9999);ds.receive(dp);//显示接收数据String s = new String(dp.getData(),0, data.length);System.out.println("接收到的数据"+s);System.out.println("显示发送方的信息"+dp.getAddress().getHostAddress());} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {ds.close();}}
}

总结:发送数据使用的工具

tcp:字节流

udp:DatagramScoket

网络编程中一些工具类

InetAddress

   public static void main(String[] args) {InetAddress host = null;try {//本机host = InetAddress.getLocalHost();System.out.println(host);//网络中任意一台InetAddress host163 = InetAddress.getByName("www.163.com");System.out.println(host163);} catch (UnknownHostException e) {e.printStackTrace();}}

URL /URLConnection

以下示例,注意点:输入流 url-内存; 输出流:内存-本地

package demo05;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;/** Created by 颜群*/
public class URLDemo {public static void main(String[] args) {InputStream in = null ;URLConnection urlConnection = null;OutputStream out = null ;try {URL url = new URL("https://www.163.com/") ;urlConnection = url.openConnection();in = urlConnection.getInputStream();out = new FileOutputStream("d:\\163.txt");byte[] buf = new byte[64] ;int len = -1 ;while(  (len = in.read(buf)) != -1 ){out.write(buf,0,len);}} catch (MalformedURLException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}finally{try {if(out!=null) out.close();if(in!=null)  in.close();} catch (IOException e) {e.printStackTrace();}}}
}

十一、网络编程。TCP\UDP\socket相关推荐

  1. 网络编程(Tcp/Udp实现聊天、文件上传)

    网络编程 1.1 概述 计算机网络是指将位置不同的多台[计算机 通过通信线路连接起来,实现资源共享和信息传递的计算机系统 1.2 网络通信的要素 ip和端口 网络通信协议(tcp/udp) 1.3 I ...

  2. 网络调试工具TCP/UDP socket的使用

    TCP/UDP socket调试工具的使用,可以在想服务器发送命令,或者查看服务器返回的数据. 打开界面后选择左边客户端还是服务端,使用TCP还是udp,点击创建相应的模拟环境.

  3. [windows网络编程]tcp/udp编程初步详解-转

    #pragma comment (lib,"ws2_32.lib") #include <Winsock2.h> #include <stdio.h> 如你 ...

  4. 网络编程---TCP/UDP套接字编程原理

    本篇介绍的是Linux下的网络编程,故有些接口是不适用于Windows的,但是具体概念和实现方法是大体一致的 本篇重在讲解原理,具体实现请戳这里->UDP套接字编程实现 介绍 网络编程套接字(s ...

  5. 大数据 -- java基础16 网络编程 TCP UDP

    1.网络编程的三要素:(1)IP地址(2)端口号(3)协议 2.IP地址 : 网络中计算机唯一标识. (1)IP地址在计算机中存储的时候是由二进制的形式进行存储的:IP:192.168.7.42 十进 ...

  6. 网络编程-tcp/udp

    Java网络编程 计算机网络就是通过传输介质.通信设施和网络协议,把分散在不同地点的计算设备互连起来,实现资 源共享和数据传输的系统. TCP/IP协议簇 TCP/IP协议栈是一系列网络协议的总和,是 ...

  7. 【Java】网络编程——TCP/UDP网络对讲机

    目录 前言 OSI概述 传输层 端口 Socket InetAddress类 UDP协议间的通信 UDP协议相关类 UDP 发送端 UDP 接收端 + 发送端 UDP 聊天 + 全局广播 UDP发送大 ...

  8. 网络编程 TCP/UDP

    网络编程 打电话–连接–接了–通话->TCP连接 发短信------发送了就完事了---->UDP连接 网络编程的目的: 传播交流信息,数据交换.资源共享.通信 想要打到这个效果需要什么: ...

  9. JDK -- 网络编程(TCP/UDP)

    三要素: IP地址: 设备在网络中的地址,是唯一的标识 端口: 应用程序在设备中唯一的标识 协议 : 数据在网络中传输的规则,常见的协议有UDP协议和TCP协议 InetAddress -- 代表IP ...

  10. Linux Socket C语言网络编程:UDP Socket

    UDP简介 UDP与TCP相比,UDP是没有链接的协议,可以把他比作电子邮件,收信方不需要确认就可以接收邮件(不需要握手),这一点以TCP协议不同. 下面简单介绍GitHub上的开源项目TCP-Soc ...

最新文章

  1. 萨克斯维修服务器,萨克斯常见故障修理方法
  2. ThinkPHP框架整合phpqrcode生成二维码DEMO
  3. e2fsck -y 故障_MC2-XWHM-Y
  4. angularjs ng-click传参控制ng-repeat元素显示与隐藏
  5. RUP,XP,敏捷原理
  6. ASP.NET Core CORS 简单使用
  7. 手把手教你获取、编译和调试Flink的源代码
  8. C#.net实现密码加密算法的语句
  9. 远程桌面和云主机,可以听到云主机内部的声音
  10. python比较长度_Python:XLRD;比较列长度
  11. 计算机学科技术前沿:第31次中国互联网络发展状况统计报告
  12. 不是外部命令也不是可运行程序_手机运行内存4G和6G有什么不同?差别不是一般大...
  13. 财务有必要学python吗-工作三年却被实习生抢了饭碗,学会Python到底有多吃香?...
  14. 用FolderBrowserDialog选择一个文件路径
  15. 正确安装Senta的姿势
  16. 日期计算(来自计蒜客)
  17. 商标注册要的一些重要基本常识(附:注册流程)
  18. mac 文字识别软件ocr_Mac上那些好用的文字识别工具
  19. 【SSRF技巧拓展】————8、微博某处SSRF可GET SHELL
  20. Python爬虫4.2 — ajax(动态网页数据抓取)用法教程

热门文章

  1. 多片段时序数据建模预测实践
  2. 【Tensorflow】图像的读取、解码、显示、处理、编码、保存
  3. 2021-06-10 JUC01DAY
  4. C++ TBB concurrent_unordered_map find() at() return static_cast<size_t>( t ) * internal::hash_multip
  5. 比特币 转账交易为什么要等6个区块确认才算到账 安全 以太坊12个区块
  6. java的启动信息_Java实现软件运行时启动信息窗口的方法
  7. java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
  8. Servlet chapter 2
  9. 阿里云ddns解决动态IP问题
  10. Java 设计模式 之 装饰器模式(Decorator)