日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java 实现 tcp_java实现TCP通信

發(fā)布時(shí)間:2024/2/28 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 实现 tcp_java实现TCP通信 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.概述

通過(guò)ServerSocket與Socket實(shí)現(xiàn)的TCP的通信,這個(gè)例子配合了swing使用,其實(shí)作者之前發(fā)過(guò)一篇ServerSocker與Socket的通信,在這里,這邊文章就是在這個(gè)例子上修改而成的.

其實(shí)原理很簡(jiǎn)單的,就是一個(gè)服務(wù)端一個(gè)客戶(hù)端,服務(wù)端這邊創(chuàng)建好ServerSocket后,使用accept()堵塞一直等待客戶(hù)端發(fā)送socket.

好吧,不廢話(huà)了.進(jìn)正題.

2.服務(wù)端

swing的部分就不說(shuō)了,說(shuō)一下主要操作.

(1)新建ServerSocket

ServerSocket serverSocket = null;

serverSocket = new ServerSocket(12345);//一個(gè)不被占用的端口即可

構(gòu)造方法的參數(shù)是端口,默認(rèn)使用本地ip. ServerSocket有三個(gè)構(gòu)造方法.

ServerSocket(int port);

ServerSocket(int port,int backlog);

ServerSocker(int poer,int backlog,InetAddress ip);

(2)接收socket

Socket socket = serverSocket.accept();

返回一個(gè)Socket(),會(huì)一直等待,處于阻塞狀態(tài). 一般設(shè)置一個(gè)while(true)循環(huán)接收.

(3)數(shù)據(jù)處理

使用DataInputStream與DataOutputStream:

DataInputStream inputStream = new DataInputStream(socket.getInputStream());

DataOutputStram outputStream = new DataOutputStream(socket.getOutputStream());

然后使用read與write方法即可. 注意關(guān)閉的時(shí)候要等輸入輸出完成后再一起關(guān)閉,就是說(shuō),不能這樣:

DataInputStream inputStream = new DataInputStream(socket.getInputStream());

String data = inputStream.readUTF();

inputStream.close();

DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());

outputStream.writeUTF("ok");

outputStream.close();

這樣的話(huà)getInputStream()沒(méi)有問(wèn)題,但是到了getOutputStream()的時(shí)候就有問(wèn)題了,會(huì)提示異常:

Socket is closed. 所以解決辦法就是等輸出完之后再一起關(guān)閉:

DataInputStream inputStream = new DataInputStream(socket.getInputStream());

String data = inputStream.readUTF();

DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());

outputStream.writeUTF("ok");

inputStream.close();//等輸出完成后再關(guān)閉

outputStream.close();

(4)完整代碼Server.java

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

import javax.swing.*;

public class Server {

public static void main(String[] args)

{

JFrame frame = new JFrame("Server");

JPanel panel = new JPanel();

JTextArea text = new JTextArea();

panel.add(text);

frame.setContentPane(panel);

frame.setSize(600, 300);

frame.setLocationRelativeTo(null);

frame.setVisible(true);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

ServerSocket serverSocket = null;

try

{

serverSocket = new ServerSocket(12345);

while (true)

{

Socket socket = serverSocket.accept();

DataInputStream inputStream = new DataInputStream(socket.getInputStream());

text.setText(inputStream.readUTF());

DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());

outputStream.writeUTF("ok");

inputStream.close();

outputStream.close();

socket.close();

}

}

catch (IOException e)

{

e.printStackTrace();

}

finally

{

try

{

serverSocket.close();

}

catch (IOException e)

{

e.printStackTrace();

}

}

}

}

3.客戶(hù)端

客戶(hù)端的操作就是開(kāi)啟一個(gè)Socket,再通過(guò)這個(gè)socket獲取對(duì)應(yīng)的輸入輸出流就可以了.

(1)新建一個(gè)Socket

Socket socket = new Socket("127.0.0.1",12345);//這個(gè)端口與服務(wù)端的端口對(duì)應(yīng)

Socket有三個(gè)構(gòu)造方法:

Socket(InetAddress ip,int port);

Socket(String ip,int port);

Socket(InetAddress ip,int port,InetAddress localIp,int localPort);

Socket(String ip,int port,InetAddress localIp,int localPort);

(2)輸入輸出

同樣使用DataInputStream與DataOutputStream:

DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());

DataInputStream inputStream = new DataInputStream(socket.getInputStream());

(3)完整代碼Client.java

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.Socket;

import javax.swing.*;

import java.awt.GridLayout;

public class Client

{

public static void main(String[] args) {

JFrame frame = new JFrame();

JTextArea text = new JTextArea();

JButton send = new JButton();

GridLayout layout = new GridLayout(2, 1, 0, 5);

frame.setTitle("Client");

frame.setVisible(true);

frame.setLocationRelativeTo(null);

frame.setSize(600, 300);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLayout(layout);

frame.add(text);

frame.add(send);

send.setText("send");

send.addActionListener(v ->

{

try

{

String host = "127.0.0.1";

int port = 12345;

Socket socket = new Socket(host, port);

DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());

outputStream.writeUTF(text.getText());

DataInputStream inputStream = new DataInputStream(socket.getInputStream());

text.setText(inputStream.readUTF());

outputStream.close();

inputStream.close();

socket.close();

}

catch (IOException e)

{

e.printStackTrace();

}

});

}

}

4.測(cè)試

先開(kāi)啟服務(wù)端,再開(kāi)啟客戶(hù)端,這里設(shè)置了服務(wù)端返回給客戶(hù)端的信息為"ok".

總結(jié)

以上是生活随笔為你收集整理的java 实现 tcp_java实现TCP通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。