python socket 编程(TCP与UDP)

2.建立UDP客户端

①创建UDPClient.py文件

2编写UDP客户端代码

1)创立3个socket以一而再服务器

贰)使用socket的connect()方法连接服务器

三)通过sendto()和recvfrom()方法通讯

肆)关闭连接

代码如下:

#UDPClient.py
from socket import *

HOST='localhost'
PORT=9993
address=(HOST,PORT)
s = socket(AF_INET,SOCK_DGRAM)

while True:
    message = raw_input('send message:>>')
    s.sendto(message,address)
    data = s.recvfrom(1024)
    print data
s.close()

365bet体育在线网投 1

三.运维客户端-服务端完结通讯

365bet体育在线网投 2

网络编制程序——基于TCP协议的Socket编制程序,基于UDP协议的Socket编制程序,socketudp

Socket编程

脚下较为流行的网络编制程序模型是客户机/服务器通讯情势

客户进度向服务器进度产生要求某种服务的央浼,服务器进程响应该请求。如图所示,平日,2个服务器进度会同时为八个客户端进程服务,图中服务器进程B1还要为客户进度A一、A贰和B2提供劳动。

 

365bet体育在线网投 3

Socket概述

壹  
所谓Socket平时也称为“套接字”,用于描述IP地址和端口,是三个通讯链的句柄。应用程序常常经过“套接字”向互联网发出请求也许应答互连网请求。

贰   Socket是接2连三运转在互连网上的五个程序间的双向通讯的端点。

3   网络通信其实指的正是Socket间的电视发表。

4   通讯的互相都有Socket,数据在七个Socket之间通过IO来开始展览传输。

 

应用Socket实行互连网通讯的进程

壹  
服务器程序将2个套接字绑定到2个特定的端口,并经过此套接字等待和监听客户的连日请求。

贰   客户程序根据服务器程序所在的主机和端口号发出连接请求。

叁  
假如一切寻常,服务器接受连接请求。并获取3个新的绑定到区别端口地址的套接字。

肆   客户和服务器通过读、写套接字举行报纸发表。

365bet体育在线网投 4

 

基于TCP协议的Socket编程

1   创设TCP服务端步骤:

a)         成立三个ServerSocket对象

b)         调用accept()方法接受客户端请求

c)         从Socket中获取I/O流

d)         对I/O流实行读写操作,完结与客户端的竞相

e)         关闭I/O流和Socket

②   创制TCP客户端步骤:

a)         创制一个Socket对象

b)         从Socket中获取I/O流

c)         对I/O流举办读写操作,完结与服务端的并行

d)         关闭I/O流和Socket

注:客户端和服务端实行数量传输时,客户端的输入流对应服务端的输出流,客户端的输出流对应服务端的输入流。

 

示范:创造2个客户端与服务端通讯的例子

包名:com.iotek.tcpsocket

服务端:

 1         // 1.创建一个ServerSocket对象
 2         ServerSocket serverSocket = new ServerSocket(8888);
 3         // 2.调用accept()方法接受客户端请求
 4         Socket socket = serverSocket.accept();
 5         System.out.println(socket.getInetAddress().getHostAddress() + "连接成功");
 6         // 3.获取socket对象的输入输出流
 7         BufferedReader br = new BufferedReader(new InputStreamReader(
 8                 socket.getInputStream()));
 9 
10         PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
11         String line = null;
12         // 读取客户端传过来的数据
13         while ((line = br.readLine()) != null) {
14             if (line.equals("over")) {
15                 break;
16             }
17             System.out.println(line);
18             pw.println(line.toUpperCase());
19         }
20 
21         pw.close();
22         br.close();
23         socket.close();
24         System.out.println(socket.getInetAddress().getHostAddress() + "断开连接");

 

客户端:

 1         Socket socket = new Socket("127.0.0.1", 8888);
 2         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 3 
 4         PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
 5         BufferedReader reader = new BufferedReader(new InputStreamReader(
 6                 socket.getInputStream()));
 7         while (true) {
 8             String line = br.readLine();// 获取键盘所输入的字符串
 9             pw.println(line);
10             if (line.equals("over")) {
11                 break;
12             }
13             System.out.println(reader.readLine());// 获取服务端传过来的大写字符串
14         }
15         reader.close();
16         br.close();
17         pw.close();
18         socket.close();

为了更加直观的看见通讯进度,将一个java程序复制到E盘根目录下,用命令行的格局来运维。

365bet体育在线网投 5

打开cmd,编译java,步骤

① 进入e盘。  e:

贰 编写翻译全数java文件。 javac –d . *.java

三 打开服务端。    java com.iotek.tcpsocket.TCPServer

肆 再展开二个cmd命令行用于展开客户端java com.iotek.tcpsocket.TCPClient

 连接成功

365bet体育在线网投 6

在客户端输入hello回车之后测试成功。

365bet体育在线网投 7

输入over,断开连接

365bet体育在线网投 8

 

基于UDP协议的Socket编程

一 创设发送端

a)    
建设构造DatagramSocket对象。该端点创设,系统会自由分配多个端口。假如不想随机配置,能够手动钦定。

b)     将数据举行packet包的卷入,必供给钦赐指标地地址和端口。

c)     通过socket服务的send方法将该包发出。

d)     将socket关闭。

贰 创立接收端

a)     建设构造DatagramSocket对象。要监听3个端口。

b)     通过socket的receive方法将数据存入数据包中。

c)    
通过数据包dp的情势getData()、getAddress()、getPort()等方法获得包中的钦点音信。

d)     将socket关闭。

 

示范:创造一个发送与吸收接纳的事例

发送端:UDPDemo1

 1         DatagramSocket socket = new DatagramSocket();
 2         String str = "i love you";
 3         // 把数据进行封装到数据报包中
 4         DatagramPacket packet = new DatagramPacket(str.getBytes(),
 5                 str.length(), InetAddress.getByName("localhost"), 6666);
 6         socket.send(packet);// 发送
 7 
 8         byte[] buff = new byte[100];
 9         DatagramPacket packet2 = new DatagramPacket(buff, 100);
10         socket.receive(packet2);
11         System.out.println(new String(buff, 0, packet2.getLength()));
12         socket.close();

 

接收端:UDPDemo2

 1         // 先接收数据
 2         DatagramSocket socket = new DatagramSocket(6666);
 3         byte[] buff = new byte[100];
 4         DatagramPacket packet = new DatagramPacket(buff, 100);
 5         socket.receive(packet);// 接受传来的数据包
 6         System.out.println(new String(buff, 0, packet.getLength()));
 7 
 8         // 发送数据
 9         String str = "me too";
10         DatagramPacket packet2 = new DatagramPacket(str.getBytes(),
11                 str.length(), packet.getAddress(), packet.getPort());
12         socket.send(packet2);
13         socket.close();

 

将二个java程序复制到E盘根目录下,用命令行的情势来运行。

365bet体育在线网投 9

打开cmd,编译java,步骤:

① 进入e盘。  e:

贰   编写翻译以UDP开首的公文。 javac –d . UDP*.java

3   先运维接收端。  java com.iotek.tcpsocket.UDP德姆o二

四   重新展开1个命令行,运营发送端。  java com.iotek.tcpsocket.UDP德姆o1

365bet体育在线网投 10

Socket编制程序 近些日子较为流行的网络编制程序模型是客户机/服务器通讯格局…

该体系参照开源项目 — Tinyhttpd ;

二 编制程序流程

三、结束语

时至前些天使用python-socket编制程序的TCP和UDP编制程序已演示甘休。

谢谢!

说明:sockaddr_in的作用?

sockaddr_in 是2个包涵互联网地址的结构体,该组织体在 <netinet/in.h>
头文件中进行定义:

struct sockaddr_in{ short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8];};

其中,in_addr 结构体也定义在 <netinet/in.h> 中,用于存放ip地址:

struct in_addr{ unsigned long s_addr;};

该结构体首要用于存放网络有关的性情消息,在 bind
时内定需求绑定的套接字;在 sendto 时钦赐必要发送到的对象;

1.1 socket类型

创建socket格式:socket([family[, type[, proto]]])

  • family: 套接字家族能够使AF_UNIX或者AF_INET
  • type:
    套接字类型能够依赖是面向连接的要么非连接分为SOCK_STREAM或SOCK_DGRAM
  • protocol: 一般不填默许为0.
Socket类型 说明
socket.AF_UNIX 只能够用于单一的Unix系统进程间通信
socket.AF_INET 服务器之间网络通信指定使用IPv4协议
socket.AF_INET6 服务器之间网络通信指定使用IPv6协议
socket.SOCK_STAEAM 流式socket,用于TCP
socket.SOCK_DGRAM 数据报式socket,用于UDP
socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP\IGMP等网络报文,而此套接字可以,其次,此套接字也可以处理特殊的ipv4报文,此外,利用原始套接字,可以通过IP_HDRINCL套接字选项,由用户构造ip头。
socket.SOCK_SEQPACKET 可靠的连续数据包服务
创建TCP socket s = socket.socket(socket.AF_INET, socket.SOCK_STAEAM)
创建UDP socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

1.建立TCP服务器

①创建TCPServer.py文件

贰编辑服务器代码

一)创立socket对象,调用socket构造函数

二)绑定ip端口(IP号和端口号)

三)设置最亚松森接数(策画套接字,以便接受连接请求)

四)使用socket的accept()方法等待客户请求一个链接

伍)获取客户请求数据

六)关闭连接

代码如下:

#TCPServer.py
#!/usr/bin/env python    

#from socket import *
import socket
#开启ip和端口
ip_port = ('127.0.0.1',9999)

#1.生成一个句柄(创建socket对象,调用socket构造函数)
sk = socket.socket()
#2.绑定ip端口(ip和端口号)
sk.bind(ip_port)
#3.最多连接数(准备套接字,以便接受连接请求)
sk.listen(5)
#开启死循环
print ('server waiting...')
#等待链接,阻塞,直到渠道链接 conn打开一个新的对象
#专门给当前链接的客户端 addr是ip地址
#4.服务器套接字通过socket的accept()方法等待客户请求一个链接
conn,addr = sk.accept()
#5.获取客户端请求数据
print('successful link,the client address:')
print(addr)
while True:

    client_data = conn.recv(1024)
    #打印对方的数据


    print ('receive Clinet Data->  '+client_data)

    if client_data=='q': break #如果lient_data为空,则跳出循环

    #向对方发送数据
    conn.send(bytes('client,I\'m server'))

#关闭链接
conn.close()
sk.close()

365bet体育在线网投 11

建立TCP server的步骤

TCP服务器的装置步骤如下:

  1. 通过 socket() 系统调用创造二个套接字;
  2. 使用 bind() 系统调用将所开创的套接字绑定到钦命的端口上;
  3. 通过 listen()
    将拓展端口绑定的套接字举办端口侦听,使客户端能够接连;
  4. 通过 accept()
    接受客户端的连年,该函数将会被卡住,直至客户端连接上来;
  5. 多少收发 read / write

留神:要是在bind绑按期,钦点端口0,意味着由系统随机挑选3个可用端口来绑定;

服务端代码示例:

// file name : server.c#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h> //定义了大量系统调用需要使用的类型#include <sys/socket.h> //定义了大量套接字所需要的结构体#include <netinet/in.h> //与网络相关的结构体及函数// 该函数将字符串 msg 输出到 stderr,并退出执行void error(char* msg){ fprintf(stderr, "%s\n", msg); exit;}int main(int argc , char* argv[]){ int sockfd; //保存服务器套接字的文件描述符 int newsockfd; //保存与客户端通讯套接字的文件描述符 int portno; //保存服务器要绑定的端口号 int clilen; //保存client地址的大小,系统调用时需要使用 int n; //存放函数read、write的返回值 char buffer[256]; //服务器将从套接字中读取的字符存入该缓存 struct sockaddr_in serv_addr, cli_addr ; //存放服务器、客户端套接字属性 if(argc < 2) error("Error : no port provided.\n"); sockfd = socket(AF_INET , SOCK_STREAM , 0); //创建TCP套接字 if(sockfd < 0) error("Error : fail to open socket"); memset(&serv_addr , 0 , sizeof(serv_addr)); portno = atoi ; //将输入的第二个参数转换为端口号 // 配置服务器参数 serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons; serv_addr.sin_addr.s_addr = INADDR_ANY; //本机地址 0 if(bind(sockfd, (const struct sockaddr*)&serv_addr, sizeof(serv_addr) ) < 0){ error("Error : binding"); } listen(sockfd, 5); //进行端口侦听 clilen = sizeof; //阻塞等待客户端的连接 newsockfd = accept(sockfd, (struct sockaddr*) &cli_addr, &clilen); if(newsockfd < 0){ error("Error on accept"); } memset(buffer, 0, 256); n = read(newsockfd, buffer, 255); if error("Error reading from socket"); printf("client message : %s\n" , buffer); n = write(newsockfd, "I got your message", 18); iferror("Error writing to socket"); close(newsockfd); close; return 0;}

网络编制程序,对负有支出语言来讲都是壹致的,python也不例外。使用python举行互联网编制程序时,其实是在python程序本身的经过内,连接受钦赐服务器进程通信端口实行通讯,所以网络通讯也足以称呼进度间通讯。

1.建立UDP服务器

①创建UDPServer.py文件

二编制伏务器代码

壹)成立socket对象,调用socket()构造函数UDP必要加参数

2)绑定IP和端口号

三)通信阶段

肆)关闭连接

代码如下:

#UDPServer.py
#!/usr/bin/env python

from socket import *

HOST = 'localhost'
PORT = 9993

s = socket(AF_INET,SOCK_DGRAM)
s.bind((HOST,PORT))
print '...waiting for message..'
while True:
    data,address = s.recvfrom(1024)
    print address,data
    s.sendto('this is the UDP server',address)
s.close()

365bet体育在线网投 12

编写翻译与运作

通过命令:

 gcc udpserver.c -o udpserver gcc udpclient.c -o udpclient

编译后,udpserver 是 “回声” 服务器, udpclient
是udp数据接收器,实验结果如下:

365bet体育在线网投 13UDP通讯

Sockets Tutorial

Programming udp sockets in C on Linux

UDP made simple

完!

2.1 TCP编程

网络编制程序包含服务端和客户端两部分,主动发起连接的是客户端,被动响应的叫服务端。
TCP服务端创造和平运动行步骤如下:

  • 创建socket,绑定本地ip和端口;
  • 始发监听;
  • 持续接到客户端请求;
  • 接收数据后,发送给对方数目;
  • 传输截至,关闭socket

# -*- coding: utf-8 -*-

import time
import socket
import threading

def dealtcp(sock, addr):
    """
    接收传来的数据,并发送给对方数据
    """
    print('Accept new connection from %s:%s' % addr)
    # 发送数据
    sock.send(b'Hello, I am server')
    # 循环接收数据
    while True:
        # 每次接收1024字节
        data = sock.recv(1024)
        # 等待1s
        time.sleep(1)
        # 如果data为空或客户端发送过来exit循环中断
        if not data or data.decode('utf-8') == 'exit':
            break
        print('客户端发来的数据:%s' % data.decode('utf-8'))
        sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
    # 关闭socket
    sock.close()
    print('Connection from %s:%s closed.' % addr)

if __name__ == '__main__':
    # 创建一个基于IPv4和TCP协议的Socket:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定本地ip和端口
    s.bind(('127.0.0.1', 8000))
    # 监听端口,传入的参数表示等待连接的最大连接数
    s.listen(10)
    print('Waiting for connection...')
    # 等待连接
    while True:
        # accept等待连接进入,返回新的socket和ip:端口
        sock, addr = s.accept()
        # 创建线程执行
        t = threading.Thread(target=dealtcp, args=(sock, addr))
        # 启动线程
        t.start()

TCP客户端创造和平运动作步骤如下:

  • 创建socket
  • 总是服务端接收发送数据
  • 传输停止,关闭socket

# -*- coding: utf-8 -*-
import socket

# 创建基于tcp和ipv4协议的socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 与服务端建立连接
s.connect(('127.0.0.1', 8000))
print('接收到的服务端数据:%s' % s.recv(1024).decode('utf-8'))
# 分别发送三个数据
for data in [b'client1', b'client2', b'client3']:
    s.send(data)
    print('服务端又返回来的数据:%s ' % s.recv(1024).decode('utf-8'))
s.send(b'exit')
# 关闭socket
s.close()

365bet体育在线网投,运维结果如下:
服务端

Waiting for connection...
Accept new connection from 127.0.0.1:61544
客户端发来的数据:client1
客户端发来的数据:client2
客户端发来的数据:client3
Connection from 127.0.0.1:61544 closed.

客户端

接收到的服务端数据:Hello, I am server
服务端又返回来的数据:Hello, client1! 
服务端又返回来的数据:Hello, client2! 
服务端又返回来的数据:Hello, client3! 

发表评论

电子邮件地址不会被公开。 必填项已用*标注