(一)网络提供的服务分两种: 面向连接的服务和无连接的服务.
对于无连接的服务(邮寄), 发送信息的计算机把数据以一定的格式封装在帧中, 把目的地址和源地址加在信息头上, 然后把帧交给网络进行发送. 无连接服务是不可靠的.
对于面向连接的服务(电话), 发送信息的源计算机必须首先与接收信息的目的计算机建立连接. 这种连接是通过三次握手(three hand shaking)的方式建立起来的. 一旦连接建立起来, 相互连接的计算机就可以进行数据交换. 与无连接服务不同, 面向连接的服务是以连接标识符来表示源地址和目的地址的. 面向连接的服务是可靠的, 当通信过程中出现问题时, 进行通信的计算机可以得到及时通知.
(二)
略
(三)
TCP
(四)
服务端- __author__ = 'longlong'
- from socket import *
- from time import ctime
-
- HOST = raw_input('Please input your host:') #注意主机名不能随便打,我小白。。。发现只有127.XX.XX.XX在本机可以正常使用
- PORT = int(raw_input('Please input your port:'))
- BUFSIZ = 1024
- ADDR = (HOST, PORT)
-
- tcpSerSork = socket(AF_INET, SOCK_STREAM)
- tcpSerSork.bind(ADDR)
- tcpSerSork.listen(5)
-
- while True:
- print ('wait for connection...')
- tcpCliSork, addr = tcpSerSork.accept()
- print ('... connected from:', addr)
-
- while True:
- data = tcpCliSork.recv(BUFSIZ)
- if not data:
- break
- tcpCliSork.send('[%s] %s' % (ctime(), data))
- tcpCliSork.close()
- tcpSerSork.close()
客户端
- __author__ = 'longlong'
- from socket import *
- HOST = raw_input('Please input your host:') #注意主机名不能随便打,我小白。。。发现只有127.XX.XX.XX在本机可以正常使用
- PORT = int(raw_input('Please input your port:'))
- ADDR = (HOST, PORT)
- BUFSIZE = 1024
- tcpCliSock = socket(AF_INET, SOCK_STREAM)
- tcpCliSock.connect(ADDR)
-
- while True:
- data = raw_input('>')
- if not data:
- break
- tcpCliSock.send(data)
- data = tcpCliSock.recv(BUFSIZE)
- if not data:
- break
- print data
- tcpCliSock.close()
(五)
服务端:
- __author__ = 'longlong'
- import socket
- HOST = ''
- PORT = 23456
- ADDR = (HOST, PORT)
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.bind(ADDR)
- s.listen(1)
- conn, addr = s.accept()
- print 'connect by', addr
- while True:
- data = conn.recv(1024)
- print 'by:', data
- if not data:
- break
- conn.close()
- s.close()
客户端:
__author__ = 'longlong'
import socket
HOST = 'localhost'
PORT = 23456
ADDR = (HOST, PORT)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(ADDR)
while True:
data = raw_input('Please input your data:')
s.send(data)
if not data:
break
s.close()
进阶:
服务端:
__author__ = 'longlong'
import socket
import time
import os
HOST = ''
PORT = 23445
ADDR = (HOST, PORT)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(ADDR)
s.listen(1)
conn, addr = s.accept()
print 'connect by', addr
while True:
data = conn.recv(1024)
if data == 'data':
conn.send(time.ctime(time.time()))
continue
if data == 'os':
conn.send(os.name)
continue
if data == 'ls':
path = os.curdir
conn.send(' '.join(os.listdir(path)))
continue
print 'by:', data
if not data:
break
conn.close()
s.close()
客户端:
__author__ = 'longlong'
import socket
HOST = 'localhost'
PORT = 23445
ADDR = (HOST, PORT)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(ADDR)
while True:
data = raw_input('Please input your data:')
if not data:
break
s.send(data)
data = s.recv(1024)
print data
s.close()
(六)
>>> import socket
>>> socket.getservbyname('daytime', 'udp')
13
(七)
服务端:
__author__ = 'longlong'
import socket
HOST = raw_input('Please a host name:')
PORT = input('Please input a port:')
ADDR = (HOST, PORT)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(ADDR)
s.listen(1)
print ('wait for a connect...')
conn, addr = s.accept()
print 'connect from', addr
try:
while True:
data = conn.recv(1024)
print '<', data
data = raw_input('>')
conn.send(data)
if not data:
break
except:
print 'welcome use me next!'
conn.close()
s.close()
客户端:
__author__ = 'longlong'
import socket
HOST = raw_input('Please input a host name:')
PORT = input('Please input a port:')
ADDR = (HOST, PORT)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(ADDR)
try:
while True:
data = raw_input('>')
if not data:
break
s.send(data)
data = s.recv(1024)
print '<', data
if not data:
break
except:
print 'welcome use me next!'
s.close()
(八)(九)(十)
全用多线程写,直接写最高级版本,
实现了各种连接各种聊天,暂时不能私聊。。。
只能群聊
客户端
- __author__ = 'longlong'
- import socket
- import threading
-
- outString = ''
- inString = ''
-
- HOST = raw_input('Please input your server\'s ip:')
- nick = raw_input('Please input your nick:')
- PORT = 9000
- ADDR = (HOST, PORT)
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect(ADDR)
- s.send(nick)
-
-
- def dealOut(conn):
- global outString
- while True:
- outString = raw_input()
- outString = nick+':'+outString
- if not outString:
- return
- conn.send(outString)
-
- def dealIn(conn):
- global inString
- while True:
- inString = conn.recv(1024)
- if not inString:
- return
- if inString != outString:
- print inString
-
-
- threading.Thread(target=dealIn, args=(s, )).start()
- threading.Thread(target=dealOut, args=(s, )).start()
服务端:
- __author__ = 'longlong'
- import socket
- import sys
- import threading
-
- data = ''
- con = threading.Condition()
- HOST = raw_input('Please input your host name:')
- PORT = 9000
- ADDR = (HOST, PORT)
-
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.bind(ADDR)
- s.listen(10)
-
- def clientThreadIn(conn, nick):
- global data
- while True:
- try:
- temp = conn.recv(1024)
- if temp == nick+':'+'exit':
- conn.close()
- NotifyAll(temp)
- except:
- NotifyAll(nick+' leave the room')
- s.close()
- break
-
-
- def NotifyAll(temp):
- global data
- if con.acquire():
- data = temp
- con.notifyAll()
- con.release()
-
-
- def clientThreadOut(conn, nick):
- global data
- while True:
- if con.acquire():
- con.wait()
- if data:
- try:
- conn.send(data)
- con.release()
- except:
- con.release()
- return
-
- while True:
- conn, addr = s.accept()
- nick = conn.recv(1024)
- print 'connent with', addr
- NotifyAll('welcome join us '+nick)
- conn.send(data)
- threading.Thread(target=clientThreadIn, args=(conn, nick)).start()
- threading.Thread(target=clientThreadOut, args=(conn, nick)).start()
(十一)
明天继续更新