2009-06-01 31 views
11

Câu hỏi: Làm thế nào để tạo một ứng dụng python có thể kết nối và gửi các gói dữ liệu qua internet đến một máy tính khác đang chạy cùng một ứng dụng? Có bất kỳ mã/thư viện hiện có nào tôi có thể sử dụng không?Tạo kết nối giữa hai máy tính trong trăn

Nền tảng: Tôi khá mới lập trình (HS cao cấp). Tôi đã tạo ra rất nhiều điều đơn giản trong python nhưng gần đây tôi đã quyết định bắt đầu một dự án lớn hơn. Tôi đang xem xét việc tạo ra một Magic: bộ mô phỏng dự thảo Gathering booster, nhưng tôi không chắc liệu nó có khả thi cho kỹ năng của tôi không vì vậy tôi hỏi xung quanh trước khi tôi bắt đầu. Ứng dụng sẽ cần phải gửi dữ liệu giữa các máy tính mà thẻ đang được chọn/chuyển.

Cảm ơn!

Trả lời

12

Twisted là một công cụ kết nối mạng sự kiện được cấp phép theo MIT. Có nghĩa là một máy đơn có thể giao tiếp với một hoặc nhiều máy khác, trong khi thực hiện các việc khác giữa dữ liệu đang được nhận và gửi, tất cả không đồng bộ và chạy trong một luồng/quy trình đơn lẻ.

Nó hỗ trợ nhiều giao thức ra khỏi hộp, vì vậy bạn cũng có thể sử dụng giao thức hiện có. Đó là tốt hơn bởi vì bạn nhận được hỗ trợ cho giao thức từ phần mềm của bên thứ ba (tức là sử dụng HTTP cho giao tiếp nghĩa là phần mềm trung gian sử dụng HTTP sẽ tương thích: proxy ...)

Nó cũng dễ dàng tạo giao thức truyền thông của riêng bạn bạn muốn gì.

documentation được làm đầy với các ví dụ.

3

Một nơi tuyệt vời để bắt đầu tìm kiếm là Python Standard Library. Đặc biệt có một vài phần mà sẽ có liên quan:

Vì bạn nói rằng bạn không có kinh nghiệm với điều này, tôi khuyên bạn nên bắt đầu với triển khai dựa trên HTTP. Giao thức HTTP khá đơn giản và dễ làm việc. Ngoài ra, có các khung công tác tốt để hỗ trợ hoạt động này, chẳng hạn như webpy cho máy chủ và HTTPLib từ thư viện chuẩn cho khách hàng.

Nếu bạn thực sự muốn đi sâu vào mạng, thì triển khai dựa trên socket có thể mang tính giáo dục. Điều này sẽ dạy cho bạn các khái niệm cơ bản được sử dụng trong của mã mạng trong khi dẫn đến giao diện tương tự với luồng tệp.

+0

Có cách sử dụng hữu ích cho các ổ cắm: http://docs.python.org/howto/sockets.html. –

+0

điểm mạnh -1 trong ổ cắm cấp thấp cho người mới bắt đầu. Theo kinh nghiệm của tôi về giảng dạy, dạy một khuôn khổ cấp cao và sau đó cho thấy việc thực hiện gạch chân có ý nghĩa hơn nhiều so với việc dạy cách làm sai. – nosklo

+1

Tôi cho rằng nó phụ thuộc vào những gì học sinh đang tìm cách để có được ra khỏi nó và mức độ mà họ đang thực sự ở. Từ pov của tôi, nếu tôi muốn tìm hiểu về giao tiếp mạng và bằng cách nào đó không bao giờ tìm hiểu về ổ cắm, tôi sẽ buồn bã. Sau khi kết nối ban đầu được hình thành, việc sử dụng ổ cắm chỉ hơi khó khăn hơn việc đọc/ghi một tệp. Lợi ích là học sinh được suy nghĩ về cách họ muốn đại diện cho dữ liệu. – Doug

7

Thư viện chuẩn bao gồm SocketServer (tài liệu here), có thể làm những gì bạn muốn.

Tuy nhiên, tôi tự hỏi nếu một giải pháp tốt hơn có thể là sử dụng hàng đợi thư. Rất nhiều triển khai tốt đã tồn tại, bao gồm các giao diện Python. Tôi đã sử dụng RabbitMQ trước đây. Ý tưởng là cả hai máy tính đều đăng ký vào hàng đợi và có thể đăng hoặc nghe các sự kiện.

+1

+1: sử dụng cài đặt bất kỳ thư viện nào có thể giúp bạn – nosklo

1

Giao tiếp sẽ diễn ra với ổ cắm, cách này hay cách khác. Chỉ cần đặt câu hỏi liệu bạn có sử dụng các thư viện cấp cao hơn hiện tại hay cuộn thư viện của riêng bạn hay không.

Nếu bạn đang làm điều này như là một kinh nghiệm học tập, có thể muốn bắt đầu ở mức độ thấp nhất có thể, để xem các loại hạt và bu lông thật. Có nghĩa là bạn có thể muốn bắt đầu với a SocketServer, bằng cách sử dụng kết nối TCP (TCP về cơ bản được đảm bảo phân phối dữ liệu; UDP không được).

Google cho một số mã ví dụ đơn giản. Thiết lập một lên là rất dễ dàng. Nhưng bạn sẽ phải xác định tất cả các chi tiết của giao thức truyền thông của bạn: kết thúc sẽ gửi khi nào và cái gì, kết thúc nghe và khi nào, người nghe chính xác sẽ mong đợi điều gì, trả lời xác nhận đã nhận, v.v.

+1

-1: Tôi thật sự không đồng ý rằng việc nhìn thấy các ổ cắm và đai ốc TCP sẽ giúp ích gì. Sử dụng ổ cắm trực tiếp sẽ chỉ khiến bạn học cách * KHÔNG * làm mã của bạn. Chỉ cần học cấp cao thay vào đó, và sau đó nghiên cứu bất kỳ thư viện nào bạn chọn. – nosklo

+1

Tôi làm rất ít lập trình trong C, nhưng tôi rất vui vì tôi biết điều đó, vì nó mang lại cho tôi kiến ​​thức sâu sắc hơn về ngôn ngữ cấp cao hơn thực sự làm việc đằng sau hậu trường với bộ nhớ và các kiểu dữ liệu phức tạp. Tôi nghĩ điều tương tự cũng đúng với lập trình socket: hầu như không bao giờ đi đến mức TCP cho một ứng dụng sản xuất, nhưng một số bài tập ở cấp đó mang lại sự hiểu biết lớn hơn về những gì mà các khung công tác cao cấp đang làm. –

+0

@ John Pirie: Vâng, nhưng bạn có nghĩ rằng một newbie nên học C (hoặc lắp ráp, cho rằng vấn đề) * đầu tiên *? Tôi không nghĩ vậy. Tôi nghĩ xu hướng tự nhiên là học cao cấp trước, và sau đó đi xuống càng nhiều càng cần thiết để hiểu các khái niệm cấp thấp sau này, sau khi các khái niệm chung được học tốt. Quan điểm của tôi là khung công tác nên đến trước. – nosklo

1

Ngoài ra, hãy kiểm tra ra Pyro (đối tượng từ xa Python). Se this answer để biết thêm chi tiết.

Pyro về cơ bản cho phép bạn xuất bản các cá thể đối tượng Python dưới dạng các dịch vụ có thể được gọi từ xa. Pyro có lẽ là cách dễ nhất để thực hiện giao tiếp quá trình Python-to-python.

1

Nó cũng đáng xem xét Kamaelia cho loại điều này - đó là hệ thống mạng gốc của chúng tôi là hệ thống mạng và tạo nên những thứ tương đối trực quan. Một số liên kết: Overview of basic TCP system, Simple Chat server, Building a layered protocol, walk-through of how to evolve new components. Khác cực đoan: P2P hệ thống radio: source, peer.

Nếu có bất kỳ sự khác biệt nào, chúng tôi đã kiểm tra xem liệu hệ thống có thể truy cập được vào người mới thông qua việc tham gia vào mã mùa hè google 3 năm liên tiếp, tích cực tham gia vào cả các nhà phát triển có kinh nghiệm và thiếu kinh nghiệm. Tất cả đều quản lý để xây dựng các hệ thống hữu ích.

Về cơ bản, nếu bạn từng chơi với các đường ống unix thì ý tưởng nên quen thuộc.

Caveat: Tôi đã viết những phần chính của Kamaelia :-)

Nếu bạn muốn tìm hiểu làm thế nào để làm những việc này, mặc dù chơi với một vài phương pháp khác nhau có ý nghĩa, và bạn chắc chắn nên kiểm tra Twisted (tiêu chuẩn trả lời cho câu hỏi này), Pyro & các công cụ thư viện chuẩn. Mỗi cách có một cách tiếp cận khác nhau và việc học chúng chắc chắn sẽ mang lại lợi ích cho bạn! Tuy nhiên, giống như nosklo, tôi khuyên bạn nên chống lại việc sử dụng thư viện socket trực tiếp và sử dụng thư viện thay thế - đơn giản vì nó khó khăn hơn nhiều để có được lập trình ổ cắm chính xác hơn so với những người có xu hướng nhận ra.

Các vấn đề liên quan