Некоторые моменты, которые должны быть ясны в отношении связи TCP:
Коммуникация TCP ориентирована на соединение, и вам нужно сначала запустить сервер, а затем запустить клиент.
И клиент, и сервер должны создавать объекты сокета. Клиент должен указать сокет сервера (IP+Port), и сервер должен указать порт службы.
Socket Client_socket = New Socket ("192.168.100.17", 8888); // Клиентский сокет (сокет класса сокета является подключенным сокетом) serversocket histure_socket = new Serversocket (8888); // Серверная розетка, в настоящее время это сокет прослушивания (адрес и порт были связаны ())Сервер должен использовать метод Accept () для преобразования сокета прослушивания в подключенный гнездо. Этот сокет прослушивания может генерировать несколько подключенных сокетов, чтобы вы также могли прослушать запросы других клиентов после подключения. Поэтому параллельный доступ должен быть реализован с использованием многопоточного чтения здесь. После получения подключенного сокета вы можете получить много информации клиента, например, IP -адрес клиента, порт, куда отправляется запрос и т. Д.
Socket server_scoket = socket.accept (); socket server_scoket2 = socket.accte (); socket server_scoket3 = socket.accept ();
Для реализации параллельных соединений на сервере примерно используйте следующий код: где ThreadTask является объектом задачи потока.
public static void main (string [] args) бросает ioException {serversocket listen_sock = new Serversocket (8888); // только один должен прослушать розетку, поэтому, хотя (true) вне задачи {// каждый раз, когда устанавливается соединение, открывается поток. Socket conn_sock = lister_sock.accept (); // Когда не появляется нового подключения, основной основной поток блокирует этот новый поток (New ThreadTask (conn_sock)). Start (); }}Клиент должен получить выходной поток на основе подключенного сокета, и сервер должен получить входной поток на основе сокета. Конечно, поскольку есть подключенный гнездо, вы можете получить входной поток и выходной поток на любом конце.
OutputStream send_stream = client_socket.getOutputStream (); // Клиент получает выходной поток inputstream recv_stream = server_socket.getinputstream ();
Сервер должен активно закрывать подключенное гнездо, а прослушивание должно быть закрыто в соответствующем месте.
Сервер должен нести ответственность за его постоянное получение.
Простой клиент:
Импорт java.io.ioexception; import java.io.outputstream; import java.net.socket; открытый класс tcpclient {public static void main (string [] args) {// 1. Создание сокета клиента C_SOCK = null; OutputStream client_outstream = null; try {c_sock = new Socket ("192.168.0.124", 8888); // 2. Получить выходной поток client_outstream = c_sock.getOutputStream (); // 3. } catch (ioException e) {e.printstackTrace (); } наконец {if (c_sock! = null) {try {c_sock.close (); } catch (ioException e) {e.printstackTrace (); }}}}}}Простая сторона сервера:
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;public class TCPServer { public static void main(String[] args) { // 1. Create a listening socket ServerSocket listen_sock = null; try {lister_sock = new Serversocket (8888); } catch (ioException i) {i.printstackTrace (); } Socket server_sock = null; Inputstream in_sock = null; while (true) {try {// 2. Установить соединение с клиентом, генерировать подключенный сокет и получить клиент IP -адрес server_sock = lister_sock.accept (); String client_ip = server_sock.getinetAddress (). Gethostaddress (); System.out.println ("client:" + client_ip + "connected"); // 3. Получить поток ввода на основе подключенного сокета и прочитать данные, отправленные клиентом in_sock = server_sock.getinputstream (); BufferedReader BUFR = New BufferedReader (New InputStreamReader (in_sock)); String line = null; while ((line = bufr.readline ())! = null) {system.out.println (line); } // 4. Закройте подключенный Socket Server_sock.close (); } catch (ioException e) {e.printstackTrace (); }}}}Ниже приведена функция загрузки файла TCP:
В дополнение к выходному потоку сокета, клиент также имеет входной поток, который считывает локальные файлы и поток ввода сокета для чтения информации обратной связи с сервера.
Сервер также имеет три потока: входные и выходные потоки сокета, и записаться на загрузку целевых файлов.
После того, как клиент считывает все данные из локального файла, ему необходимо использовать shutdownoutput () сокета, чтобы уведомить сервер, что выходной поток сокета достиг конца.
Чтобы предоставить функции загрузки для нескольких человек, сервер должен использовать несколько потоков для реализации параллельных соединений.
Клиент:
Импорт java.io.bufferedReader; Import Java.io.fileinputStream; Import Java.io.ioException; Import Java.io.InputStream; Import Java.io.InputStreamReader; импорт java.io.OutputStream; импорт java.socket; public uploadclient {public void main (string) Автопогенерированный метод Stub String Server_addr = "192.168.0.124"; int server_port = 8888; Сокет send_sock = null; FileInputStream local_read = null; try {// 1.. Клиентский сокет send_sock = new Socket (server_addr, server_port); // 2. Получить выходной поток конвейера подключения outputStream send_stream = send_sock.getOutputStream (); // 3. Byte Input Stream считывает данные локального файла и использует выходной поток сокета для отправки local_read = new FileInputStream ("d: /myjava/net/sql.docx"); byte [] buf = new Byte [1024]; int len = 0; while ((len = local_read.read (buf))! = -1) {send_stream.write (buf, 0, len); } // 4. Отметьте выходной поток до конца send_sock.shutdownoutput (); // 5. Получить данные обратной связи с сервера, такие как загрузка успешной, сбой загрузки и т. Д. inputStream recv_stream = send_sock.getInputStream (); BufferedReader ACK_RECV = New BufferedReader (New InputStreamReader (recv_stream)); String line = null; while ((line = ack_recv.readline ())! = null) {system.out.println (line); }} catch (ioException i) {i.printStackTrace (); } наконец {if (send_sock! = null) {try {send_sock.close (); local_read.close (); } catch (ioException i1) {i1.printstackTrace (); }} if (local_read! = null) {try {local_read.close (); } catch (ioException i2) {i2.printstackTrace (); }}}}}}Серверная сторона:
Импорт java.io.file; import java.io.fileoutputstream; import java.io.ioexception; импорт java.io.inputstream; import java.io.outputstream; import java.net.serversocket; import java.net.socket; public ulloadserver {public void void void main (string) = новый Serversocket (8888); // только один должен прослушать сокет, поэтому, хотя (true) {// Каждый раз, когда устанавливается соединение, запускается поток. Socket conn_sock = lister_sock.accept (); // Когда не появляется нового подключения, основной основной потоки блокирует здесь новый поток (новый uploader (conn_sock)). Start (); }}} класс uploader реализует runnable {private file dest_dir = new File ("d:/temp"); // Справочник загрузки // подключить сокет inputstream recv_stream = null; FileOutputStream dest_stream = null; Uploader (socket conn_sock) бросает ioexception {this.conn_sock = conn_sock; } public void run () {try {if (! dest_dir.exists ()) {dest_dir.mkdirs (); } // 1. Получить входной поток, соединяющий трубопровод recv_stream = conn_sock.getinputstream (); // клиент IP String client_ip = conn_sock.getinetAddress (). Gethostaddress (); System.out.println (client_ip + "..... подключен"); // 2. Место загрузки файла, то есть выходной целью, называется в честь IP. Если файл уже существует, создайте новый файл с кронштейнами и номерами, такими как "192.168.100.23 (1) .txt" file dest_file = новый файл (dest_dir, client_ip + ".docx"); int count = 1; while (dest_file.exists ()) {dest_file = new File (dest_dir, client_ip + "(" + count + ")" + ".docx"); count ++; } // 3. Прочитать данные и записать в целевой файл dest_stream = new FileOutputStream (dest_file); byte [] buf = new Byte [1024]; int len = 0; while ((len = recv_stream.read (buf))! = -1) {dest_stream.write (buf, 0, len); } // 4. byte [] text = "Загрузить успешно!". Getbytes (); ack_send.write (текст); } catch (ioException e1) {e1.printstacktrace (); } наконец {if (dest_stream! = null) {try {dest_stream.close (); } catch (ioException i) {i.printstackTrace (); }} if (conn_sock! = null) {try {conn_sock.close (); } catch (ioException i) {i.printstackTrace (); }}}}}}Приведенные выше примеры связи TCP и простой функции загрузки файлов в сетевом программировании Java - это все контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.