Tôi thích Java. Tôi sẽ giải thích TCP:
Khái niệm cơ bản là bạn phải chạy "Máy chủ" trên máy. Máy chủ đó chấp nhận các máy khách chờ kết nối. Mỗi kết nối đi qua một cổng (bạn biết đấy, tôi hy vọng ...).
Luôn sử dụng các cổng trên 1024 vì các cổng thấp hơn 1025 phần lớn thời gian dành cho các giao thức chuẩn (như HTTP (80), FTP (21), Telnet, ...)
Tuy nhiên, tạo Máy chủ bằng Java được thực hiện theo cách này:
ServerSocket server = new ServerSocket(8888); // 8888 is the port the server will listen on.
"Ổ cắm" là từ bạn có thể đang tìm kiếm nếu bạn muốn nghiên cứu.
Và để kết nối khách hàng của bạn đến một máy chủ bạn phải viết này:
Socket connectionToTheServer = new Socket("localhost", 8888); // First param: server-address, Second: the port
Nhưng bây giờ, không có vẫn còn là một kết nối. Máy chủ phải chấp nhận ứng dụng khách chờ đợi (như tôi đã thấy ở trên):
Socket connectionToTheClient = server.accept();
Xong! Kết nối của bạn đã được thiết lập! Giao tiếp giống như File-IO. Điều duy nhất bạn phải ghi nhớ là bạn phải quyết định khi nào bạn muốn xóa bộ đệm và thực sự gửi dữ liệu qua socket.
Sử dụng một PrintStream cho văn bản viết là rất tiện dụng:
OutputStream out = yourSocketHere.getOutputStream();
PrintStream ps = new PrintStream(out, true); // Second param: auto-flush on write = true
ps.println("Hello, Other side of the connection!");
// Now, you don't have to flush it, because of the auto-flush flag we turned on.
Một BufferedReader cho văn bản đọc là tốt (tốt nhất *) tùy chọn:
InputStream in = yourSocketHere.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = br.readLine();
System.out.println(line); // Prints "Hello, Other side of the connection!", in this example (if this would be the other side of the connection.
Hy vọng rằng bạn có thể bắt đầu với mạng với điều này thông tin!
PS: Tất nhiên, tất cả mã mạng phải được thử bắt đối với IOExceptions.
EDIT: Tôi quên viết lý do tại sao không phải lúc nào cũng là tùy chọn tốt nhất. Một BufferedReader sử dụng một bộ đệm và đọc nhiều như nó có thể vào bộ đệm. Nhưng đôi khi bạn không muốn BufferedReader đánh cắp các byte sau dòng mới và đặt chúng vào bộ đệm của chính nó.
dụ viết tắt:
InputStream in = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
// The other side says hello:
String text = br.readLine();
// For whatever reason, you want to read one single byte from the stream,
// That single byte, just after the newline:
byte b = (byte) in.read();
Nhưng BufferedReader đã có byte đó, bạn muốn đọc, trong bộ đệm của mình. Vì vậy, gọi in.read()
sẽ trả lại byte theo sau trên byte cuối cùng trong bộ đệm của người đọc. Vì vậy, trong tình huống này, giải pháp tốt nhất là sử dụng DataInputStream
và quản lý nó theo cách riêng của bạn để biết chuỗi sẽ dài bao nhiêu và chỉ đọc số byte đó và chuyển đổi chúng thành một chuỗi.Hoặc: Bạn sử dụng
DataInputStream.readLine()
Phương pháp này không sử dụng bộ đệm và đọc byte theo byte và kiểm tra dòng mới. Vì vậy, phương pháp này không ăn cắp các byte từ InputStream cơ bản.
Chỉ vì tò mò. Làm thế nào bạn quản lý để "biết rất tốt Java, C và C + +" nhưng không bao giờ tham gia với mạng? – Cratylus
@ user384706: Bằng cách học cú pháp của ngôn ngữ, hầu hết các thư viện của chúng và thu được nhiều kinh nghiệm với chúng. Tôi đã xác định rằng tôi giỏi với các ngôn ngữ đó để giao tiếp rằng tôi không cần các hướng dẫn cho người mới bắt đầu nhằm mục đích dạy lập trình và kết nối mạng với nhau, hoặc hướng đến các lập trình viên mới bắt đầu. Giống như "Bây giờ chúng ta sẽ tìm hiểu vòng lặp while - và sau đó, chúng ta sẽ chuyển sang sử dụng vòng lặp để gửi nhiều phần dữ liệu cùng một lúc" :) – Cam
Máy ảo không thực sự cần thiết trong trải nghiệm của tôi ... bạn có thể mô phỏng nhiều máy chỉ đơn giản bằng cách chạy nhiều tiến trình trong một hệ điều hành duy nhất. –