Scoket网络编程(python/Java版)

来源:互联网 发布:宏观研究知乎 编辑:程序博客网 时间:2024/05/17 23:22


'''
网络:计算机与计算机之间的通信
      协议:
          TCP:可靠,有状态,长连接的协议(具有应答机制)

              主叫方     被叫方
                         服务套接字(socket)
              客户套接字       ==           客户套接字
          UDP:不可靠,无连接(类似快递)
          HTTP
          FTP
          POP3
          SMTP

'''

Socket:

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个SocketSocket通常用来实现客户方和服务方的连接。SocketTCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定.但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。

Socket编程思路

TCP服务端:

创建套接字,绑定套接字到本地IP与端口

   # socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.bind()

开始监听连接                   #s.listen()

进入循环,不断接受客户端的连接请求              #s.accept()

然后接收传来的数据,并发送给对方数据         #s.recv() , s.sendall()

传输完毕后,关闭套接字                     #s.close()


TCP客户端:

创建套接字,连接远端地址

       # socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.connect()

连接后发送数据和接收数据          # s.sendall(), s.recv()

传输完毕后,关闭套接字          #s.close()

----------------------------华丽的分割线---------------------------


---------------------------一对一聊天demo---------------------------


---被叫方(也叫服务端)

import socket
import  threading


#创建服务套接字
ss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

'''
服务套接字绑定主机,绑定端口号
如果主机为"0.0.0.0",所有人可以连接
如果主机为"localhost",只能自己访问
如果主机为一个指定ip,只能该IP或其子网IP访问
'''
ss.bind(("0.0.0.0",9999))

ss.listen(5)           #设置最大连接数
c=ss.accept()       #如果没有客户端连接,线程阻塞
                            #ss.accept()返回连接者的对象及连接者的Ip
print("我被人连接啦!!")

def mydecv(c):
    while True:
        msg = c.recv(1024)          #接受发送的utf-8数据,utf-8一个字节为3
        print(msg.decode())         #接受数据时需要解析

threading._start_new_thread(mydecv,(c[0],))

while True:
    msg = input()
    c[0].send(msg.encode())


---主叫方(也叫客户端)


import socket
import  threading
c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# c.connect(("192.168.66.180",9999))
c.connect(("192.168.12.53",9999))#连接服务端,不成功抛出异常
print("我已经连接到服务端")

def mydecv(c):
    while True:
        msg = c.recv(1024)
        print(msg.decode())

threading._start_new_thread(mydecv,(c,))
while True:
    msg = input()
    c.send(msg.encode())


--------------多人聊天demo-------------------------

---chatServer

import socket
import  threading
ss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

ss.bind(("0.0.0.0",9999))
ss.listen(10)

msg=None
lock=threading.Lock()
con=threading.Condition(lock)


def server_recv(c,a):
    global msg
    while True:
        str1=c.recv(1024)
        con.acquire()
        msg=str(a)+str1.decode()
        con.notify_all()
        con.release()
def server_send(c,a):
    global msg
    while True:
        con.acquire()
        con.wait()
        con.release()
        c.send(msg.encode())
while True:
    c,a=ss.accept()                                     #c:连接者的对象,a:连接者的IP
    print("c:{0},a:{1}".format(c,a))
    threading._start_new_thread(server_recv,(c,a))
    print("recv.....")
    threading._start_new_thread(server_send,(c,a))
    print("send.....")


---主叫方(也叫客户端)


import socket
import  threading
c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# c.connect(("192.168.66.180",9999))
c.connect(("192.168.12.53",9999))#连接服务端,不成功抛出异常
print("我已经连接到服务端")

def mydecv(c):
    while True:
        msg = c.recv(1024)
        print(msg.decode())

threading._start_new_thread(mydecv,(c,))
while True:
    msg = input()
    c.send(msg.encode())




原创粉丝点击