2013-06-27 38 views
5

Tôi có một chương trình java chạy như một máy chủ chấp nhận các kết nối và tôi kết nối các máy khách Android với nó. Khách hàng được kết nối trong một thời gian dài với ổ cắm của họ.Ổ cắm Java (Android tới máy chủ Java)

1) Tôi có thể đồng thời có bao nhiêu máy khách (trong thực tế - hiện tại không nói về số lượng cổng) trên một máy trung bình có RAM 3 Gb?

2) Nếu điện thoại sử dụng 3G cho kết nối, có thể ổ cắm bị hỏng không? Nếu có, làm thế nào để tôi phục hồi nó hoặc nó nên được thực hiện từ phía khách hàng? Hay nó được thực hiện tự động? Nó có xảy ra thường xuyên không?

+0

có lẽ bạn nên xem xét nio java hoặc dự án như netty nếu bạn quan tâm nhiều hơn đến điểm 1. – Abe

Trả lời

3

1) Phụ thuộc vào những gì máy chủ làm cho khách hàng. Nếu máy chủ chỉ chấp nhận kết nối và không làm gì hơn thì nó có thể phục vụ hàng chục nghìn máy khách. Nếu máy chủ làm một cái gì đó đòi hỏi CPU, bộ nhớ hoặc I/O nó có thể phục vụ ít khách hàng hơn.

2) Có, kết nối TCP có thể bị hỏng, thậm chí qua mạng có dây. Nếu liên kết quay trở lại, kết nối ổ cắm không bị hỏng; TCP xử lý việc truyền lại dữ liệu bị mất. Vấn đề là, điều gì xảy ra nếu liên kết không quay lại? Nếu bạn sử dụng SO_KEEPALIVE thì kết nối sẽ bị đóng, nhưng vì thời gian chờ mặc định là các ứng dụng 2 giờ nhạy cảm với vấn đề này, hãy triển khai cơ chế thời gian chờ của riêng chúng.

+0

Theo số 2, điều đó có nghĩa là ổ cắm sẽ khôi phục dưới mui xe nếu có sự cố ổ cắm? Và vấn đề là làm thế nào để phát hiện xem các ổ cắm đã bị hỏng quá lâu? (Có, ổ cắm là TCP) –

+1

Kết nối vĩnh viễn là ảo ảnh; TCP hoạt động bằng cách gửi các gói tin. Liên kết bị hỏng có nghĩa là các gói bị thiếu. Nếu liên kết xuất hiện trở lại, các gói sẽ bắt đầu trở lại. Bạn có thể đọc ở đây cách giao dịch TCP với mất gói: https://en.wikipedia.org/wiki/Transmission_Control_Protocol – Joni

+1

@ArtemMoskalev Ổ cắm sẽ không phục hồi. TCP sẽ chịu đựng các vấn đề kết nối liên tục và mất gói tin - và nếu bạn không thực hiện bất kỳ giao tiếp nào, nó có thể chịu đựng mất kết nối trong nhiều tháng. Tuy nhiên, có rất nhiều trường hợp không phục hồi - vì vậy bạn phải xử lý điều đó (ví dụ: NAT/firewall định thời gian kết nối của bạn, lỗi mạng khiến TCP hết thời gian chờ và nhiều tình huống khác). Bạn phải phát hiện điều này trên máy khách để nó có thể kết nối lại và trên máy chủ để nó có thể loại bỏ các ổ cắm cũ/chết. – nos

1

1) Có bao nhiêu khách hàng nào tôi có thể máy chủ đồng thời có (trong thực tế - im không nói về số lượng cổng bây giờ) trên một máy trung bình với 3 Gb RAM?

Tùy thuộc vào lượng tài nguyên được tiêu thụ bởi mỗi kết nối (một chuỗi cho mỗi kết nối) ở phía máy chủ và trong bao lâu. Các hoạt động (giới hạn CPU và giới hạn IO) mà bạn thực hiện cho mỗi yêu cầu cho mỗi kết nối. Và nếu bạn đang sử dụng Cơ sở dữ liệu để đọc dữ liệu ở phía máy chủ thì số lượng kết nối có thể giảm đáng kể.

2) Nếu điện thoại sử dụng 3G để kết nối, có thể ổ cắm bị hỏng không? Nếu có, làm thế nào để tôi phục hồi nó hoặc nó nên được thực hiện từ phía khách hàng? Hay nó được thực hiện tự động? Điều đó có xảy ra thường xuyên không?

Có thể có nhiều lý do khiến hỏng ổ cắm bao gồm: Lỗi máy chủ, Lỗi mạng, Thời gian chờ của ổ cắm hoặc nhiều hơn thế. Nếu một Ổ cắm bị hỏng thì có không có cách nào để khôi phục lại nó trở lại. Nó không thể được thực hiện tự động bởi TCP. Bạn sẽ phải kết nối lại với máy chủ trong trường hợp đó. Như quy định trong tài liệu chính thức oracle của Socket#getInputStream()

Trong điều kiện không bình thường kết nối cơ bản có thể được phá vỡ bởi các máy chủ từ xa hoặc các phần mềm mạng (ví dụ như một thiết lập lại kết nối trong trường hợp các kết nối TCP). Khi một kết nối bị hỏng được phát hiện bởi các phần mềm mạng sau áp dụng cho các dòng đầu vào trở lại: -

  • Phần mềm mạng có thể loại bỏ các byte được đệm bằng các ổ cắm. Số byte không bị phần mềm mạng loại bỏ có thể là đọc bằng cách đọc.
  • Nếu không có byte đệm trên ổ cắm, hoặc tất cả các byte đệm đã được tiêu thụ bởi đọc, sau đó tất cả các cuộc gọi tiếp theo để đọc sẽ ném một IOException.
  • Nếu không có byte đệm trên ổ cắm, ổ cắm và chưa được đóng lại bằng gần, sau đó sẵn sẽ trở lại 0.
0

Cần biết thêm thông tin, ví dụ như khi khách hàng kết nối những gì làm họ làm, chờ đợi dữ liệu gửi từ máy chủ o ngược lại? Họ giữ một hộp thoại o chỉ cần chờ đợi cho các dữ liệu truyền từ phía bên kia mà không có bất kỳ hộp thoại?

Tôi giả sử khi khách hàng kết nối bạn bắt đầu một luồng để gửi khách hàng đó, trong chuỗi đó bạn có thể đặt thời gian chờ, khoảng 15-30 phút, nếu không nhận được dữ liệu trong thời gian đó bạn chỉ cần đóng socket và kết thúc chủ đề. Ngoài ra, IP có thể thiết lập nhiều hơn 1 kết nối không? Nếu không, bạn cần phải theo dõi ai đã kết nối và chấm dứt phiên trước đó trong trường hợp IP đã có trong danh sách.

Nếu điều quan trọng là phải theo dõi tiến độ kết nối, ý tôi là bạn cần phải tiếp tục ở đâu, sau đó cần thực hiện hộp thoại chính xác để tránh trùng lặp các giao dịch và tin nhắn. Và có một vân vân dài, nhưng, như tôi đã nói trước đây, cần thêm thông tin về dự án.

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