网络编程,socket
1.网络编程 网络:
TCP/IP 彼此之间遵守协议和规范!之间才能产生通信! IP: 每个人都有自己的身份证号!
用来标识我们网络中每一台计算机! IP地址= 网络地址 +主机地址
网络地址 :标识我们计算机和所在网络的网段
主机地址 :标识我们的主机 IPv4 : 纯数字 32位
组成: 4个8位的2进制数组成
每一个8位的2进制数 最大到255! 00000000 00000000 00000000 00000000
因为2进制数不容易记忆
192.168.30.247 每个电脑中预留的一个ipv4地址:(127.0.0.1) IPv6 :数字,字母和符号 128位 是ipv4的4倍
每个电脑中预留的一个ipv6地址: (::1) 例子: 小明和小红是好朋友,他们俩个需要通过微信进行聊天! 01.两人家里都有电脑
02.电脑必须都有TCP/IP协议,都有ip地址
03.找到对方的ip地址
04.找到微信对应的端口号
05.进行通信 端口号 0-65535
系统预留 0-1024 查询本机ip地址
ipconfig 测试网络是否畅通
ping ip地址 域名
DNS(Domain Name System) 域名系统
对应的就是一个ip地址 www.baidu.com
www.jd.com 网络服务器
能够提供用户服务的计算机! 邮件服务器
web服务器 网络通信协议:
在不同的计算机之间进行通信而建立的一些约束和规范的集合! TCP协议:(Transmission Control Protocol)传输控制协议
面向连接的,可靠的,基于字节流的传输通信协议! 安全! 我们两个人在玩篮球,在我传球给你的时候,我需要考虑你知否能接住球!
因为要考虑,所以传球的速度可能慢! UDP协议: (User Datagram Protocol) 用户数据报协议
没有连接协议。在我们传输数据之前,客户端和服务器没有建立连接!不安全! 我们两个人在玩篮球,在我传球给你的时候,我不考虑你知否能接住球!直接扔给你!
因为不需要考虑,所以传球的速度快! TCP协议中的Socket ServerSocket 服务器 指定端口号
Socket 客户端 ip + 端口号 UDP协议中的Socket DatagramSocket 接收 发送 指定端口号
DatagramPacket 打包 拆包 ip + 端口号 服务器的操作
01.打开服务器 设置端口号
02.开始接收客户端的信息DatagramSocket
03.拆包DatagramPacket
04.需要给客户端响应
05.打包DatagramPacket
06.发送给客户端DatagramSocket 客户端的操作
01.创建客户端 找到服务器的ip和端口号
02.打包DatagramPacket
03.发送给服务器DatagramSocket
04.接收服务器的响应DatagramSocket
05.拆包DatagramPacket
2.代码:
01.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; /**
* 超市 =====》服务器
*/
public class ServerSocketTest { public static void main(String[] args) {
ServerSocket serverSocket = null; // 超市
Socket socket = null; // 顾客
InputStream inputStream = null; // 购物车
BufferedReader br = null; // 收银员
OutputStream outputStream = null; // 收银员的反馈信息
try {
// 创建一个指定位置的超市 (服务器)
serverSocket = new ServerSocket(8800);
// 超市开门 等待顾客购物
socket = serverSocket.accept();
// 顾客开始疯狂购物
inputStream = socket.getInputStream();
/**
* 收银员会一个商品一个商品进行扫码
* inputStream:顾客购买的商品
*/
br = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println("您购买的商品是:" + line);
}
/**
* 顾客买完商品 结了账 能不能转转?? 没出超市
* 结束购物 结账
*/
socket.shutdownInput(); // 关闭了输入流
// 打开输出流
outputStream = socket.getOutputStream();
outputStream.write("谢谢您的光临".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
// 释放资源
try {
outputStream.close();
socket.close();
br.close();
inputStream.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
} } } }
TCP:超市--顾客案例。超市
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; /**
* 顾客=====》客户端
*/
public class SocketTest { public static void main(String[] args) {
Socket socket = null; // 顾客
OutputStream outputStream = null; // 钱包
InputStream inputStream = null; // 账单或者是收银员的回馈信息
BufferedReader br = null;
try {
// 顾客去哪个地方的哪个超市购物
socket = new Socket("localhost", 8800);
// 消费 相当于 钱从钱包 出去了.......
outputStream = socket.getOutputStream();
outputStream.write("买了一艘航空母舰".getBytes());
// 购物完毕
socket.shutdownOutput(); // 接收收银员的回馈信息
inputStream = socket.getInputStream();
// 循环获取收银员的回馈信息
br = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
inputStream.close();
socket.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} } }
TCP:超市--顾客案例。顾客
02.多用户登录
import java.net.ServerSocket;
import java.net.Socket; /**
* 服务器
*/
public class ServerTest {
public static void main(String[] args) { ServerSocket serverSocket = null;
Socket socket = null; try {
// 创建服务器对象
serverSocket = new ServerSocket(8800);
// 一直监听 客户端是否有人登录
while (true) {
socket = serverSocket.accept();
/**
* 这个socket是第几个用户??? 不知道
* 只知道一个socket就是一个线程
*/
LoginThread thread = new LoginThread(socket);
thread.start();// 启动线程
}
} catch (Exception e) {
e.printStackTrace();
} } }
服务器端
import java.io.Serializable; /**
* 用户类
*/
public class User implements Serializable { private String name;
private String password; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public User(String name, String password) {
super();
this.name = name;
this.password = password;
} public User() {
super();
} public String toString() {
return "User [name=" + name + ", password=" + password + "]";
} }
用户类
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.Socket; public class LoginThread extends Thread { // 创建每个用户对应的socket
Socket socket = null; public LoginThread(Socket socket) {
this.socket = socket;
} // 获取客户端的请求 给客户端响应
public void run() { InputStream is = null;
OutputStream os = null;
// 反序列化
ObjectInputStream ois = null;
// 打开输入流和输出流
try {
is = socket.getInputStream();
os = socket.getOutputStream();
ois = new ObjectInputStream(is);
User user = (User) ois.readObject();
System.out.println("您的用户名是:" + user.getName());
System.out.println("您的密码是:" + user.getPassword());
socket.shutdownInput(); // 给用户成功响应
os.write("恭喜您登录成功!".getBytes()); } catch (Exception e) {
e.printStackTrace();
} finally {
try {
os.close();
socket.close();
ois.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
} } } }
多线程实现多用户
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket; /**
* 用户登录 用户1
*/
public class ClientTest { public static void main(String[] args) {
Socket socket = null;
InputStream inputStream = null;
OutputStream outputStream = null;
BufferedReader br = null;
// 序列化
ObjectOutputStream oos = null; try {
// 创建socket对象
socket = new Socket("localhost", 8800);
// 打开输入流和输出流
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
// 创建登录的对象
User user = new User("admin1", "123456");
// 序列化到服务器
oos = new ObjectOutputStream(outputStream);
oos.writeObject(user);
socket.shutdownOutput(); // 登录成功之后 服务器会给我们响应 需要接收
br = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println("服务器给我们的回应=====》" + line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
br.close();
socket.close();
oos.close();
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} } }
用户1
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket; /**
* 用户登录 用户2
*/
public class ClientTest2 { public static void main(String[] args) {
Socket socket = null;
InputStream inputStream = null;
OutputStream outputStream = null;
BufferedReader br = null;
// 序列化
ObjectOutputStream oos = null; try {
// 创建socket对象
socket = new Socket("localhost", 8800);
// 打开输入流和输出流
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
// 创建登录的对象
User user = new User("admin2", "654321");
// 序列化到服务器
oos = new ObjectOutputStream(outputStream);
oos.writeObject(user);
socket.shutdownOutput(); // 登录成功之后 服务器会给我们响应 需要接收
br = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println("服务器给我们的回应=====》" + line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
br.close();
socket.close();
oos.close();
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} } }
用户2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket; /**
* 用户登录 用户3
*/
public class ClientTest3 { public static void main(String[] args) {
Socket socket = null;
InputStream inputStream = null;
OutputStream outputStream = null;
BufferedReader br = null;
// 序列化
ObjectOutputStream oos = null; try {
// 创建socket对象
socket = new Socket("localhost", 8800);
// 打开输入流和输出流
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
// 创建登录的对象
User user = new User("admin3", "123456789");
// 序列化到服务器
oos = new ObjectOutputStream(outputStream);
oos.writeObject(user);
socket.shutdownOutput(); // 登录成功之后 服务器会给我们响应 需要接收
br = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println("服务器给我们的回应=====》" + line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
br.close();
socket.close();
oos.close();
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} } }
用户3
网络编程,socket的更多相关文章
- 网络编程socket基本API详解(转)
网络编程socket基本API详解 socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket ...
- Android 网络编程 Socket
1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...
- 网络编程Socket之TCP之close/shutdown具体解释(续)
接着上一篇网络编程Socket之TCP之close/shutdown具体解释 如今我们看看对于不同情况的close的返回情况和可能遇到的一些问题: 1.默认操作的close 说明:我们已经知道writ ...
- 铁乐学Python_Day33_网络编程Socket模块1
铁乐学Python_Day33_网络编程Socket模块1 部份内容摘自授课老师的博客http://www.cnblogs.com/Eva-J/ 理解socket Socket是应用层与TCP/IP协 ...
- Python网络编程socket
网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...
- java网络编程socket\server\TCP笔记(转)
java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04| 分类: Socket | 标签:java |举报|字号 订阅 1 TCP的开销 a ...
- linux网络编程-socket(37)
在编程的时候需要加上对应pthread开头的头文件,gcc编译的时候需要加了-lpthread选项 第三个参数是线程的入口参数,函数的参数是void*,返回值是void*,第四个参数传递给线程函数的参 ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- Python开发【第八篇】:网络编程 Socket
Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
- python网络编程socket /socketserver
提起网络编程,不同于web编程,它主要是C/S架构,也就是服务器.客户端结构的.对于初学者而言,最需要理解的不是网络的概念,而是python对于网络编程都提供了些什么模块和功能.不同于计算机发展的初级 ...
随机推荐
- mysql数据据备份与还原
http://www.cnblogs.com/kissdodog/p/4174421.html备份:mysqldump -u username -p dbname > BackupName.sq ...
- 一个简单好用的日志框架NLog
之前我介绍过如何使用log4net来记录日志,但最近喜欢上了另一个简单好用的日志框架NLog. 关于NLog和log4net的比较这里就不多讨论了,感兴趣的朋友可以参看.NET日志工具介绍和log4n ...
- java中的ElasticSearch搜索引擎介绍。
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...
- (转) 为什么不应该重写service方法?
故事通常是这样开始的: 从前,有一个程序猿,他语重心长地对孙子说:“孩子,要是你以后写servlet,最好不要重写service方法啊” 孙子大为不解,程序猿又说:“听爷爷的,准没错,爷爷的爷爷就是这 ...
- myBatis学习之路1-基本功能实现
myBatis也是一个持久型框架,相较于hibernate来说,算是轻量级的. 1.配置mybatis环境 相关jar下载地址:mybatis+mysalJAR包 2.新建一个java project ...
- Consul 常用指令
Consul 常用指令 # 通告地址 -advertise # 集群节点之间通信地址 -bind # 设置服务器为bootstrap模式.在一个dc中只有一个server处于bootstrap模式.一 ...
- Linux 查看dns运行状态
命令:dig www.baidu.com #测试解析 安装:yum install bind-utils @<服务器地址>:指定进行域名解析的域名服务器: -b<ip地址>: ...
- 剑指offer(38)二叉树的深度
题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 题目分析 树的深度=左子树的深度和右子树深度中最大者+1 代码 fu ...
- Django中CBV(Class Base Views)模型源码分析
在view文件中编写一个类,并配置好路由 class Test(View): def get(self, request, *args, **kwargs): return HttpResponse( ...
- springboot集成h2以及可视化操作
1.新建项目