十一、网络编程。TCP\UDP\socket
网络编程
文章目录
- 网络编程
- 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相关推荐
- 网络编程(Tcp/Udp实现聊天、文件上传)
网络编程 1.1 概述 计算机网络是指将位置不同的多台[计算机 通过通信线路连接起来,实现资源共享和信息传递的计算机系统 1.2 网络通信的要素 ip和端口 网络通信协议(tcp/udp) 1.3 I ...
- 网络调试工具TCP/UDP socket的使用
TCP/UDP socket调试工具的使用,可以在想服务器发送命令,或者查看服务器返回的数据. 打开界面后选择左边客户端还是服务端,使用TCP还是udp,点击创建相应的模拟环境.
- [windows网络编程]tcp/udp编程初步详解-转
#pragma comment (lib,"ws2_32.lib") #include <Winsock2.h> #include <stdio.h> 如你 ...
- 网络编程---TCP/UDP套接字编程原理
本篇介绍的是Linux下的网络编程,故有些接口是不适用于Windows的,但是具体概念和实现方法是大体一致的 本篇重在讲解原理,具体实现请戳这里->UDP套接字编程实现 介绍 网络编程套接字(s ...
- 大数据 -- java基础16 网络编程 TCP UDP
1.网络编程的三要素:(1)IP地址(2)端口号(3)协议 2.IP地址 : 网络中计算机唯一标识. (1)IP地址在计算机中存储的时候是由二进制的形式进行存储的:IP:192.168.7.42 十进 ...
- 网络编程-tcp/udp
Java网络编程 计算机网络就是通过传输介质.通信设施和网络协议,把分散在不同地点的计算设备互连起来,实现资 源共享和数据传输的系统. TCP/IP协议簇 TCP/IP协议栈是一系列网络协议的总和,是 ...
- 【Java】网络编程——TCP/UDP网络对讲机
目录 前言 OSI概述 传输层 端口 Socket InetAddress类 UDP协议间的通信 UDP协议相关类 UDP 发送端 UDP 接收端 + 发送端 UDP 聊天 + 全局广播 UDP发送大 ...
- 网络编程 TCP/UDP
网络编程 打电话–连接–接了–通话->TCP连接 发短信------发送了就完事了---->UDP连接 网络编程的目的: 传播交流信息,数据交换.资源共享.通信 想要打到这个效果需要什么: ...
- JDK -- 网络编程(TCP/UDP)
三要素: IP地址: 设备在网络中的地址,是唯一的标识 端口: 应用程序在设备中唯一的标识 协议 : 数据在网络中传输的规则,常见的协议有UDP协议和TCP协议 InetAddress -- 代表IP ...
- Linux Socket C语言网络编程:UDP Socket
UDP简介 UDP与TCP相比,UDP是没有链接的协议,可以把他比作电子邮件,收信方不需要确认就可以接收邮件(不需要握手),这一点以TCP协议不同. 下面简单介绍GitHub上的开源项目TCP-Soc ...
最新文章
- 萨克斯维修服务器,萨克斯常见故障修理方法
- ThinkPHP框架整合phpqrcode生成二维码DEMO
- e2fsck -y 故障_MC2-XWHM-Y
- angularjs ng-click传参控制ng-repeat元素显示与隐藏
- RUP,XP,敏捷原理
- ASP.NET Core CORS 简单使用
- 手把手教你获取、编译和调试Flink的源代码
- C#.net实现密码加密算法的语句
- 远程桌面和云主机,可以听到云主机内部的声音
- python比较长度_Python:XLRD;比较列长度
- 计算机学科技术前沿:第31次中国互联网络发展状况统计报告
- 不是外部命令也不是可运行程序_手机运行内存4G和6G有什么不同?差别不是一般大...
- 财务有必要学python吗-工作三年却被实习生抢了饭碗,学会Python到底有多吃香?...
- 用FolderBrowserDialog选择一个文件路径
- 正确安装Senta的姿势
- 日期计算(来自计蒜客)
- 商标注册要的一些重要基本常识(附:注册流程)
- mac 文字识别软件ocr_Mac上那些好用的文字识别工具
- 【SSRF技巧拓展】————8、微博某处SSRF可GET SHELL
- Python爬虫4.2 — ajax(动态网页数据抓取)用法教程
热门文章
- 多片段时序数据建模预测实践
- 【Tensorflow】图像的读取、解码、显示、处理、编码、保存
- 2021-06-10 JUC01DAY
- C++ TBB concurrent_unordered_map find() at() return static_cast<size_t>( t ) * internal::hash_multip
- 比特币 转账交易为什么要等6个区块确认才算到账 安全 以太坊12个区块
- java的启动信息_Java实现软件运行时启动信息窗口的方法
- java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
- Servlet chapter 2
- 阿里云ddns解决动态IP问题
- Java 设计模式 之 装饰器模式(Decorator)