网络编程TCP:


服务器端口了解:

  • port:0~65535
  1. web服务:80
  2. 邮箱服务:556
  3. 0~1024:为服务默认的公认端口,一般我们不能用

套接字:socket

  • socket作用
  1. ip:port,有协议加持绑定了IP属性,协议属性变量
  • 一般步骤模型如下:

import socket
服务端:
s = socket.socket(IP类型是啥,协议类型是啥)
  # ip类型:
  # socket.AF_INET ipv4的
  # socket.AF_INET6 ipv6的
  # 协议:
  # socket.SOCK_STREAM TCP协议的
  # socket.SOCK_DGRAM UDP协议的 
s.bind( (ip,port) ) #绑定可用IP和端口
  # ip可以是一个空字符串,代表所有可用IP
  # 公网IP 47.98.190.149
  # 私网IP 172.16.253.97
  # 本地回环 127.0.0.1
s.listen(5) # 服务器开启监听
  #参数:连接等待个数
c,addr = s.accept() # 阻塞 等待别人连接,阻塞会有两个返回值, 第一个是套接字 第二个是来访者的ip和端口的元组
  # c:套接字
  # addr:来访者IP和端口的元组
c.recv(1024)
  # 参数:你一次性拿取对方传递来的多少数据,字节单位
c.send(data.encode())
  # data: 编码过后的字符串对象 (二进制)
s.close() #关闭套接字
c.close() #关闭套接字
客户端:
s = socket.socket(IP类型是啥,协议类型是啥)
  #初始化定义ip协议类型
s.connect( (ip,port) )
  #客户端通过IP和端口的元组连接服务器
s.recv(1024)
  # 参数:你一次性拿取对方传递来的多少数据,字节单位
s.send(data.encode())
  # data: 编码过后的字符串对象 (二进制)
s.close() #关闭套接字

下面是根据上面的socket编写以tcp协议简单的单线程聊天代码:(单线程只能1对1)


server端:

import socket
ip = '' #这里可以为空代表所有ip都可以用
port = 8082
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定属性ipv4,tcp协议
s.bind((ip,port)) #绑定可用ip和端口
s.listen(5) #允许5台客户端连接
while True:
try:
c,addr = s.accept() #阻塞 等待别人连接,没有人连我就不执行下面的代码,一般生产环境用的都是非阻塞的
print(c)
print(addr)
while True:
#阻塞会有两个返回值,下面服务阻塞返回的c
date = c.recv(1024) #接收客户端的数据,1024字节单位
if date:
print('[%s]发来的消息:%s' % (addr,date.decode('utf-8')))
while True: #这里循环的是输入空数据是无限循环
msg = input('>>>') #输入你要发送的数据
if msg:
c.send(msg.encode('utf-8')) #向客户端发送数据
break
else:
print('不能输入空数据,请从新发送')
else:
print('客户端已经关闭')
c.close()
break
except KeyboardInterrupt:#ctrl + c 终结程序
s.close()
break
print('服务已关闭') 

clitent端:

import socket
ip = '192.168.137.128'
port = 8082
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定属性ipv4,tcp协议
s.connect( (ip,port)) #客户端通过IP和端口的元组连接服务器
while True:
try:
msg = input('>>>')
if msg:
s.send(msg.encode('utf-8')) #向服务端发送数据
else:
print('不能发送空数据,请从新输入')
continue
date = s.recv(1024)
if date:
print('服务器返回的数据:',date.decode('utf-8'))
else:
print('服务端已经关闭')
s.close()
break
except KeyboardInterrupt: #ctrl + c
s.close()
break
print('客户端已关闭')

运行结果:

 

   

网络编程UCP:


套接字:socket

  • 一般步骤模型如下:

import socket
服务端:
s = socket.socket(IP类型是啥,协议类型是啥)
  # ip类型:
  # socket.AF_INET ipv4的
  # socket.AF_INET6 ipv6的
  # 协议类型:
  # socket.SOCK_STREAM TCP协议的
  # socket.SOCK_DGRAM UDP协议的 
s.bind( (ip,port) ) #UDP服务器只需要绑定自身可用IP和端口即可
  # ip可以是一个空字符串,代表所有可用IP
  # 公网IP 47.98.190.149
  # 私网IP 172.16.253.97
  # 本地回环 127.0.0.1
data,c_addr = s.recvfrom() #获取这个套接字接受到的数据
     #data:发来的数据
     #c_addr:谁发来的
 
s.sendto(msg,c_addr) #回复消息
udp客户端:
socket(AF_INET,SOCK_DGRAM) #(IP类型是啥,协议类型是啥)
c.sendto(msg,s_addr) #发消息给服务端
data,s_addr = c.recvfrom() #服务端返回的数据

下面是根据上面的socket编写以udp协议简单的多线程聊天代码:(1对多个客户端)


server:

import socket
ip = '' #默认允许所有的ip
port = 8083 #服务器开通的端口
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #初始化ip协议类型
s.bind((ip,port)) #绑定服务ip端口
while True:
try:
while True:
date,c_addr = s.recvfrom(1024) #接受客户端发来的消息
print('%s:%s' % (c_addr,date.decode('utf-8')))
while True:
msg = input('>>>> ')
if msg == 'quit' or msg == 'q':
s.close()
print('服务端已关闭')
exit()
if msg:
s.sendto(msg.encode('utf-8'),c_addr) #向客户端返回消息
break
else:
print('不能回复为空,请从新回复消息')
except KeyboardInterrupt:
break
s.close()
print('服务端已关闭')

client:

import socket
ip = '192.168.137.128' #服务器ip
port = 8083 #服务器端口
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #绑定属性ipv4,udp协议
while True:
try:
msg = input('>>> ') #输入要发送的消息
if msg == 'quit' or msg == 'q':
break
if msg:
s.sendto(msg.encode('utf-8'),(ip,port)) #想服务器发送消息
else:
print('消息不能为空,请从新回复')
date,c_addr = s.recvfrom(1024) #接受服务器返回的消息
print('%s:%s' % (c_addr,date.decode('utf-8')))
except KeyboardInterrupt:
break
s.close()
print('客户端已经关闭')

运行结果:

server端:

 

client1:

client2:

 

32.网络编程TCP/UDP服务的更多相关文章

  1. iOS 网络编程 TCP/UDP HTTP

    一.HTTP协议的主要特点: 1. CS模式 2. 简单快速:只需要传送请求方法和路径.(常用方法有GET,HEAD,POST) 3. 灵活:任意对象都可以,类型由Content-Type加以标记 4 ...

  2. java 网络编程-tcp/udp

    --转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...

  3. 28_网络编程-TCP/UDP

    一.传输层       1.定义       IP首部有一个协议字段,用来标识网络层(IP)的上一层所采用的是哪一种传输层协议.根据这个字段的协议号,就可以识别IP传输的数据部分究竟是TCP的内容还是 ...

  4. Java网络编程——TCP/UDP

    UDP:面向无连接 ☆ 将数据及源地址和目的地址封装成数据包中 ☆ 每个数据报的大小限制在64K ☆ 不可靠协议 ☆ 不需要建立连接,速度快 TCP:面向有连接 ☆ 建立连接,形成传输数据的通道 ☆ ...

  5. python 网络编程-TCP/UDP

    摘抄自:廖雪峰的官方网站:http://www.liaoxuefeng.com/ TCP客户端和服务器端代码: #coding=utf-8 #客户端程序TCP 连接 import socket s=s ...

  6. Java网络编程(TCP协议-服务端和客户端交互)

    客户端: package WebProgramingDemo; import java.io.IOException; import java.io.InputStream; import java. ...

  7. TCP/IP网络编程之多线程服务端的实现(二)

    线程存在的问题和临界区 上一章TCP/IP网络编程之多线程服务端的实现(一)的thread4.c中,我们发现多线程对同一变量进行加减,最后的结果居然不是我们预料之内的.其实,如果多执行几次程序,会发现 ...

  8. TCP/IP网络编程之多进程服务端(二)

    信号处理 本章接上一章TCP/IP网络编程之多进程服务端(一),在上一章中,我们介绍了进程的创建和销毁,以及如何销毁僵尸进程.前面我们讲过,waitpid是非阻塞等待子进程销毁的函数,但有一个不好的缺 ...

  9. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

随机推荐

  1. using来定义类的别名,typedef,#define

    宏定义:其实就是替换作用 #define TRUE 1    //结尾无分号,宏名TRUE,计算机会把所有TRUE替换为1. typedef:定义类的别名 tpyedef unsigned int U ...

  2. Selenium中使用Cookies绕过登录

    在使用selenium测试后台时常常每个流程都需要走登录流程,这样自然比较浪费时间.如果遇到登录需要输入验证码等情况,就可能出师未捷身先死. 在Web应用中,登录状态通常是通过Cookie中对应的se ...

  3. java试题复盘——9月26日

    5.在 JAVA 编程中, Java 编译器会将 Java 程序转换为(A) A.  字节码 B.  可执行代码 C.  机器代码 D.  以上都不对 解析: 编译器将Java源代码编译成字节码cla ...

  4. intel官方的手册

    最近在学习汇编语言,需要用到intel的手册,无论是csdn还是其他的,都要下载币,还不便宜,也很老的资料了. 直接到这个地址:https://software.intel.com/en-us/art ...

  5. elasticsearch shield在java中的应用

    官方文档:https://www.elastic.co/guide/en/shield/current/_using_elasticsearch_java_clients_with_shield.ht ...

  6. Linux设备驱动 之 中断处理程序

    注册中断处理程序 中断处理程序是管理硬件驱动程序的组成部分:如果设备使用中断,那么相应的驱动程序就注册一个中断处理程序: 驱动程序通过request_irq()函数注册,并且激活给定的中断线,以处理中 ...

  7. linux下如何交叉编译util-linux?

    1. 获取源码 wget https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.34/util-linux-2.34.tar.xz ...

  8. Tomca的启动与关闭

    点击startup.bat启动,遇到一闪而过的问题,可能尚未配置JAVA_HOME 8080端口被占用导致启动失败 关闭Tomcat的三种方式 * 点击x (不推荐) * 双击shutdown.bat ...

  9. DriverManager

    1: 注册驱动 Class.forName("com.mysql.jdbc.Driver") ; static { try { java.sql.DriverManager.reg ...

  10. 005-多线程-锁-JUC锁-LockSupport【使用、Unsafe、对比Object的wait、底层源码】

    一.概述 在Java多线程中,当需要阻塞或者唤醒一个线程时,都会使用LockSupport工具类来完成相应的工作.LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能 ...