You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

socket.py 9.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. """Preliminary socket module.
  2. XXX Restrictions:
  3. - Only INET sockets
  4. - No asynchronous behavior
  5. - No socket options
  6. - Can't do a very good gethostbyaddr() right...
  7. """
  8. import java.net
  9. import org.python.core
  10. import jarray
  11. import string
  12. __all__ = ['AF_INET', 'SOCK_DGRAM', 'SOCK_RAW', 'SOCK_RDM', 'SOCK_SEQPACKET',
  13. 'SOCK_STREAM', 'SocketType', 'error', 'getfqdn', 'gethostbyaddr',
  14. 'gethostbyname', 'gethostname', 'socket']
  15. error = IOError
  16. AF_INET = 2
  17. SOCK_DGRAM = 1
  18. SOCK_STREAM = 2
  19. SOCK_RAW = 3 # not supported
  20. SOCK_RDM = 4 # not supported
  21. SOCK_SEQPACKET = 5 # not supported
  22. SOL_SOCKET = 0xFFFF
  23. SO_REUSEADDR = 4
  24. def _gethostbyaddr(name):
  25. # This is as close as I can get; at least the types are correct...
  26. addresses = java.net.InetAddress.getAllByName(gethostbyname(name))
  27. names = []
  28. addrs = []
  29. for addr in addresses:
  30. names.append(addr.getHostName())
  31. addrs.append(addr.getHostAddress())
  32. return (names, addrs)
  33. def getfqdn(name=None):
  34. """
  35. Return a fully qualified domain name for name. If name is omitted or empty
  36. it is interpreted as the local host. To find the fully qualified name,
  37. the hostname returned by gethostbyaddr() is checked, then aliases for the
  38. host, if available. The first name which includes a period is selected.
  39. In case no fully qualified domain name is available, the hostname is retur
  40. New in version 2.0.
  41. """
  42. if not name:
  43. name = gethostname()
  44. names, addrs = _gethostbyaddr(name)
  45. for a in names:
  46. if a.find(".") >= 0:
  47. return a
  48. return name
  49. def gethostname():
  50. return java.net.InetAddress.getLocalHost().getHostName()
  51. def gethostbyname(name):
  52. return java.net.InetAddress.getByName(name).getHostAddress()
  53. def gethostbyaddr(name):
  54. names, addrs = _gethostbyaddr(name)
  55. return (names[0], names, addrs)
  56. def socket(family, type, flags=0):
  57. assert family == AF_INET
  58. assert type in (SOCK_DGRAM, SOCK_STREAM)
  59. assert flags == 0
  60. if type == SOCK_STREAM:
  61. return _tcpsocket()
  62. else:
  63. return _udpsocket()
  64. class _tcpsocket:
  65. sock = None
  66. istream = None
  67. ostream = None
  68. addr = None
  69. server = 0
  70. file_count = 0
  71. reuse_addr = 0
  72. def bind(self, addr, port=None):
  73. if port is not None:
  74. addr = (addr, port)
  75. assert not self.sock
  76. assert not self.addr
  77. host, port = addr # format check
  78. self.addr = addr
  79. def listen(self, backlog=50):
  80. "This signifies a server socket"
  81. assert not self.sock
  82. self.server = 1
  83. if self.addr:
  84. host, port = self.addr
  85. else:
  86. host, port = "", 0
  87. if host:
  88. a = java.net.InetAddress.getByName(host)
  89. self.sock = java.net.ServerSocket(port, backlog, a)
  90. else:
  91. self.sock = java.net.ServerSocket(port, backlog)
  92. if hasattr(self.sock, "setReuseAddress"):
  93. self.sock.setReuseAddress(self.reuse_addr)
  94. def accept(self):
  95. "This signifies a server socket"
  96. if not self.sock:
  97. self.listen()
  98. assert self.server
  99. sock = self.sock.accept()
  100. host = sock.getInetAddress().getHostName()
  101. port = sock.getPort()
  102. conn = _tcpsocket()
  103. conn._setup(sock)
  104. return conn, (host, port)
  105. def connect(self, addr, port=None):
  106. "This signifies a client socket"
  107. if port is not None:
  108. addr = (addr, port)
  109. assert not self.sock
  110. host, port = addr
  111. if host == "":
  112. host = java.net.InetAddress.getLocalHost()
  113. self._setup(java.net.Socket(host, port))
  114. def _setup(self, sock):
  115. self.sock = sock
  116. if hasattr(self.sock, "setReuseAddress"):
  117. self.sock.setReuseAddress(self.reuse_addr)
  118. self.istream = sock.getInputStream()
  119. self.ostream = sock.getOutputStream()
  120. def recv(self, n):
  121. assert self.sock
  122. data = jarray.zeros(n, 'b')
  123. m = self.istream.read(data)
  124. if m <= 0:
  125. return ""
  126. if m < n:
  127. data = data[:m]
  128. return data.tostring()
  129. def send(self, s):
  130. assert self.sock
  131. n = len(s)
  132. self.ostream.write(s)
  133. return n
  134. def getsockname(self):
  135. if not self.sock:
  136. host, port = self.addr or ("", 0)
  137. host = java.net.InetAddress.getByName(host).getHostAddress()
  138. else:
  139. if self.server:
  140. host = self.sock.getInetAddress().getHostAddress()
  141. else:
  142. host = self.sock.getLocalAddress().getHostAddress()
  143. port = self.sock.getLocalPort()
  144. return (host, port)
  145. def getpeername(self):
  146. assert self.sock
  147. assert not self.server
  148. host = self.sock.getInetAddress().getHostAddress()
  149. port = self.sock.getPort()
  150. return (host, port)
  151. def setsockopt(self, level, optname, value):
  152. if optname == SO_REUSEADDR:
  153. self.reuse_addr = value
  154. def getsockopt(self, level, optname):
  155. if optname == SO_REUSEADDR:
  156. return self.reuse_addr
  157. def makefile(self, mode="r", bufsize=-1):
  158. file = None
  159. if self.istream:
  160. if self.ostream:
  161. file = org.python.core.PyFile(self.istream, self.ostream,
  162. "<socket>", mode)
  163. else:
  164. file = org.python.core.PyFile(self.istream, "<socket>", mode)
  165. elif self.ostream:
  166. file = org.python.core.PyFile(self.ostream, "<socket>", mode)
  167. else:
  168. raise IOError, "both istream and ostream have been shut down"
  169. if file:
  170. return _tcpsocket.FileWrapper(self, file)
  171. class FileWrapper:
  172. def __init__(self, socket, file):
  173. self.socket = socket
  174. self.sock = socket.sock
  175. self.istream = socket.istream
  176. self.ostream = socket.ostream
  177. self.file = file
  178. self.read = file.read
  179. self.readline = file.readline
  180. self.readlines = file.readlines
  181. self.write = file.write
  182. self.writelines = file.writelines
  183. self.flush = file.flush
  184. self.seek = file.seek
  185. self.tell = file.tell
  186. self.socket.file_count += 1
  187. def close(self):
  188. if self.file.closed:
  189. # Already closed
  190. return
  191. self.socket.file_count -= 1
  192. self.file.close()
  193. if self.socket.file_count == 0 and self.socket.sock == 0:
  194. # This is the last file Only close the socket and streams
  195. # if there are no outstanding files left.
  196. if self.sock:
  197. self.sock.close()
  198. if self.istream:
  199. self.istream.close()
  200. if self.ostream:
  201. self.ostream.close()
  202. def shutdown(self, how):
  203. assert how in (0, 1, 2)
  204. assert self.sock
  205. if how in (0, 2):
  206. self.istream = None
  207. if how in (1, 2):
  208. self.ostream = None
  209. def close(self):
  210. sock = self.sock
  211. istream = self.istream
  212. ostream = self.ostream
  213. self.sock = 0
  214. self.istream = 0
  215. self.ostream = 0
  216. # Only close the socket and streams if there are no
  217. # outstanding files left.
  218. if self.file_count == 0:
  219. if istream:
  220. istream.close()
  221. if ostream:
  222. ostream.close()
  223. if sock:
  224. sock.close()
  225. class _udpsocket:
  226. def __init__(self):
  227. self.sock = None
  228. self.addr = None
  229. def bind(self, addr, port=None):
  230. if port is not None:
  231. addr = (addr, port)
  232. assert not self.sock
  233. host, port = addr
  234. if host == "":
  235. self.sock = java.net.DatagramSocket(port)
  236. else:
  237. a = java.net.InetAddress.getByName(host)
  238. self.sock = java.net.DatagramSocket(port, a)
  239. def connect(self, addr, port=None):
  240. if port is not None:
  241. addr = (addr, port)
  242. host, port = addr # format check
  243. assert not self.addr
  244. if not self.sock:
  245. self.sock = java.net.DatagramSocket()
  246. self.addr = addr # convert host to InetAddress instance?
  247. def sendto(self, data, addr):
  248. n = len(data)
  249. if not self.sock:
  250. self.sock = java.net.DatagramSocket()
  251. host, port = addr
  252. bytes = jarray.array(map(ord, data), 'b')
  253. a = java.net.InetAddress.getByName(host)
  254. packet = java.net.DatagramPacket(bytes, n, a, port)
  255. self.sock.send(packet)
  256. return n
  257. def send(self, data):
  258. assert self.addr
  259. return self.sendto(self.addr)
  260. def recvfrom(self, n):
  261. assert self.sock
  262. bytes = jarray.zeros(n, 'b')
  263. packet = java.net.DatagramPacket(bytes, n)
  264. self.sock.receive(packet)
  265. host = packet.getAddress().getHostName()
  266. port = packet.getPort()
  267. m = packet.getLength()
  268. if m < n:
  269. bytes = bytes[:m]
  270. return bytes.tostring(), (host, port)
  271. def recv(self, n):
  272. assert self.sock
  273. bytes = jarray.zeros(n, 'b')
  274. packet = java.net.DatagramPacket(bytes, n)
  275. self.sock.receive(packet)
  276. m = packet.getLength()
  277. if m < n:
  278. bytes = bytes[:m]
  279. return bytes.tostring()
  280. def getsockname(self):
  281. assert self.sock
  282. host = self.sock.getLocalAddress().getHostName()
  283. port = self.sock.getLocalPort()
  284. return (host, port)
  285. def getpeername(self):
  286. assert self.sock
  287. host = self.sock.getInetAddress().getHostName()
  288. port = self.sock.getPort()
  289. return (host, port)
  290. def __del__(self):
  291. self.close()
  292. def close(self):
  293. sock = self.sock
  294. self.sock = 0
  295. sock.close()
  296. SocketType = _tcpsocket
  297. def test():
  298. s = socket(AF_INET, SOCK_STREAM)
  299. s.connect(("", 80))
  300. s.send("GET / HTTP/1.0\r\n\r\n")
  301. while 1:
  302. data = s.recv(2000)
  303. print data
  304. if not data:
  305. break
  306. if __name__ == '__main__':
  307. test()