tcp網絡通信教程 java_基于java TCP網絡通信的實例詳解

JAVA中設計網絡編程模式的主要有TCP和UDP兩種,TCP是屬于即時通信,UDP是通過數據包來進行通信,UDP當中就會牽扯到數據的解析和傳送。在安全性能方面,TCP要略勝一籌,通信過程中不容易出現數據丟失的現象,有一方中斷,兩方的通信就會結束,UDP數據包傳送的過程當中,一方中斷,數據包有很大的可能丟失,還有可能傳來的數據包的順序是錯亂的;在效率方面,UDP要比TCP快的不只是一點點的問題,若終端有解析數據方法的函數,數據包就會源源不斷的傳送過來,然后反饋回去。

以上都是我自己的理解,下面是關于TCP協議通信的兩個類;

Server類:package TCP;

import java.io.*;

import java.net.*;

import javax.swing.*;

public class Server {

//服務器端的輸入流

static BufferedReader br;

//服務器端的輸出流

static PrintStream ps;

//服務器相關的界面組件

static JTextArea text;

JFrame frame;

public Server(){

//服務器端的界面的實例化

JFrame frame=new JFrame("服務器端");

text=new JTextArea();

JScrollPane scroll =new JScrollPane(text);

frame.add(scroll);

frame.setVisible(true);

frame.setSize(300,400);

//這里設置服務器端的文本框是不可編輯的

text.setEditable(false);

}

public static void main(String[] args) throws Exception{

new Server(); //生成服務器界面

//通過服務器端構造函數 ServerSocket(port) 實例化一個服務器端口

ServerSocket server=new ServerSocket(2000);

text.append("監聽2000端口"+"\n");

//實例化一個接受服務器數據的對象

Socket client=server.accept();

br =new BufferedReader(new InputStreamReader(client.getInputStream()));

ps =new PrintStream(client.getOutputStream());

String msg;

//如果輸入流不為空,將接受到的信息打印到相應的文本框中并反饋回收到的信息

while ((msg =br.readLine())!=null)

{

text.append("服務器端收到:"+msg+"\n");

ps.println(msg);

if(msg.equals("quit"))

{

text.append("客戶端“2000”已退出!"+"\n");

text.append("服務器程序將退出!");

break;

}

}

ps.close();

br.close();

client.close();

}

}

Client類:package TCP;

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import javax.swing.*;

import java.net.*;

public class Client implements ActionListener{

//這里有兩個圖形界面,一個是連接的frame,另一個和服務器通信的界面frame1

private JFrame frame;

private JLabel adress;

private JLabel port;

JTextField adresstext;

JTextField porttext;

JButton connect;

private JFrame frame1;

private JLabel shuru;

private JPanel panel1;

private JPanel panel2;

private JLabel jieshou;

JButton send;

static JTextArea shurukuang;

static TextArea jieshoukuang;

//從服務端接受的數據流

static BufferedReader br1;

//從客戶端輸出的數據流

static PrintStream ps;

//從通信界面中的輸入框接受的數據流

static BufferedReader br2;

static Socket client;

//將輸入框字符串轉換為字符串流所需的字符串的輸入流

static ByteArrayInputStream stringInputStream ;

public Client() {

//連接界面的實例化

frame=new JFrame();

adress=new JLabel("IP 地址");

port =new JLabel("端口號");

adresstext=new JTextField("127.0.0.1",10);

porttext=new JTextField("2000",10);

connect=new JButton("連接");

//連接界面的布局

frame.setLayout(new FlowLayout());

frame.add(adress);

frame.add(adresstext);

frame.add(port);

frame.add(porttext);

frame.add(connect);

frame.setVisible(true);

frame.setSize(200,150);

connect.addActionListener(this);

//通信界面的實例化

frame1=new JFrame();

shuru=new JLabel("請輸入");

shurukuang=new JTextArea("請輸入····",5,40);

panel1=new JPanel();

panel1.add(shuru);

panel1.add(shurukuang);

panel1.setLayout(new FlowLayout());

send=new JButton("發送");

panel2=new JPanel();

jieshou=new JLabel("已接受");

jieshoukuang=new TextArea(8,60);

jieshoukuang.setEditable(false);

panel2.add(jieshou);

panel2.add(jieshoukuang);

panel2.setLayout(new FlowLayout());

frame1.setLayout(new FlowLayout());

//通信界面都的布局

frame1.add(BorderLayout.NORTH,panel1);

frame1.add(send);

frame1.add(BorderLayout.SOUTH,panel2);

//連接時通信界面是處于看不到的

frame1.setVisible(false);

frame1.setSize(500,350);

send.addActionListener(this);

}

//兩個界面當中都有相應的按鈕時間,為相應的時間添加動作

public void actionPerformed(ActionEvent e) {

if(e.getSource()==connect){

try {

//當觸發連接按鈕時,實例化一個客戶端

client=new Socket("127.0.0.1",2000);

//隱藏連接界面,顯示通信界面

frame.setVisible(false);

frame1.setVisible(true);

jieshoukuang.append("已經連接上服務器!"+"\n");

} catch (IOException e1){

System.out.println("鏈接失敗!");

e1.printStackTrace();

}

}

//通信界面中的發送按鈕相應的時間處理

if(e.getSource()==send){

//將輸入框中的字符串轉換為字符串流

stringInputStream = new ByteArrayInputStream((shurukuang.getText()).getBytes());

br2 =new BufferedReader(new InputStreamReader(stringInputStream));

String msg;

try{

while((msg=br2.readLine())!=null){

ps.println(msg); //將輸入框中的內容發送給服務器端

jieshoukuang.append("向服務器發送:"+msg+"\n");

jieshoukuang.append("客戶端接受相應:"+br1.readLine()+"\n");

if(msg.equals("quit"))

{

jieshoukuang.append("客戶端將退出!");

br1.close();

ps.close();

client.close();

frame1.setVisible(false);

break;

}

}

}catch(IOException e2){

System.out.println("讀輸入框數據出錯!");

}

shurukuang.setText("");

}

}

public static void main(String[] args) throws IOException{

new Client(); //實例化連接界面

client=new Socket("127.0.0.1",2000);

//從服務端接受的數據

br1=new BufferedReader(new InputStreamReader(client.getInputStream()));

//從客戶端輸出的數據

ps =new PrintStream(client.getOutputStream());

}

}

寫完這兩個類以后還是有幾個問題:

1)main 函數為什么非要用 static 來修飾?

2)緩沖對象 BufferedReader 為什么不能直接用于判斷,非要將讀到的數據賦值給字符串來進行操作?

3)在連接界面當中的 Connect 按鈕事件 當中我有實例化一個 客戶端的對象,但是我注釋掉主函數當中 client=new Socket("127.0.0.1",2000); 的這一句的時候,就會發現拋出 NULLPOINTEXCEPTION 異常,我很不理解?

希望有看到這文章的大牛們能不吝賜教,我也正在不停的翻著《Think in java》希望在某個不起眼的角落里面發現我的答案。

更多基于java TCP網絡通信的實例詳解相關文章請關注PHP中文網!

本文原創發布php中文網,轉載請注明出處,感謝您的尊重!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533356.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533356.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533356.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java博客論壇設計報告_javaweb課程設計報告個人博客網站的實現(Java).doc

javaweb課程設計報告個人博客網站的實現(Java)項目名稱: 個人博客網站的實現(Java) 學生姓名:學 號:班 級:指導教師:2014年12月23日目錄1 緒論11.1系統應用意義11.2主要設計任務11.3開發及運行環境11.3.1 JSP的基礎——…

java replace stringbuilder_java.lang.StringBuilder.replace()方法實例

全屏java.lang.StringBuilder.replace()方法按照這個順序,在指定的字符串的子字符串替換字符。子串開始在指定start的 索引,并延伸到該字符 end - 1,或如果序列的末端不存在這樣的字符。聲明以下是java.lang.StringBuilder.replace()方法的聲…

中小學課java_java畢業設計_springboot框架的中小學排課與實現

這是一個基于java的畢業設計項目,畢設課題為springboot框架的中小學排課與實現, 是一個采用b/s結構的javaweb項目, 開發工具eclipsei/eclipse, 項目框架jspspringbootmybatis, 中小學排課與實現采用mysql進行數據存儲, 并基于mybatis進行了orm實體關系映射, 該中小學排課與實現…

java 文件設置為只讀文件系統_Java如何設置文件為只讀?

在java編程中,如何設置文件為只讀?此示例演示如何使用File類的file.setReadOnly()和file.canWrite()方法設置文件為只讀模式。package com.yiibai;import java.io.File;public class ReadOnlyFile {public static void main(String[] args) {File file …

wordcount linux java_linux下在eclipse上運行hadoop自帶例子wordcount

啟動eclipse:打開windows->open perspective->other->map/reduce 可以看到map/reduce開發視圖。設置Hadoop location.打開windows->show view->other-> map/reduce Locations視圖,在點擊大象后【new Hadoop location】彈出的對話框(Ge…

php java執行linux_java_java執行Linux命令的方法,本文實例講述了java執行Linux命 - phpStudy...

java執行Linux命令的方法本文實例講述了java執行Linux命令的方法。分享給大家供大家參考。具體實現方法如下:public class StreamGobbler extends Thread {InputStream is;String type;public StreamGobbler(InputStream is, String type) {this.is is;this.type …

java怎么接收前端請求_前端json post 請求 后端怎么接收

前端提交POST /api/test HTTP/1.1Host: 192.168.135.69:81Connection: keep-aliveContent-Length: 18Origin: http://192.168.135.69:81User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15…

minimum在java中的意思_Java Calendar getMinimum()用法及代碼示例

Calendar類中的getMinimum(int calndr_field)方法用于返回此Calendar實例的給定日歷字段(int calndr_field)的最小值。用法:public abstract int getMinimum(int calndr_field)參數:該方法采用一個參數calndr_field,該參數表示要操作的日歷字段。返回值&…

django mysql 一對多_請教,django中 如何向帶有外鍵(一對多和多對多)數據庫中批量插入數據?...

已自行解決,代碼如下:json格式:[{"標題": "小武","內容": "測試","類型":["情感","文學","散文"]"文章資源":[{"title":"小武.1…

安裝php no permision,php安裝過程中的No package ‘xxx’ found問題

php No package ‘oniguruma’ found今天安裝php7.4的時候遇到這樣的一個報錯,然后yum install oniguruma oniguruma-devel,重試安裝php,依然報錯,又編譯安裝oniguruma,重試安裝php,還是報錯,問…

php httpclient.class.php,php實現httpclient類示例

class httpClient {public $buffer null; // buffer 獲取返回的字符串public $referer null; // referer 設置 HTTP_REFERER 的網址public $response null; // response 服務器響應的 header 信息public $request null; // request 發送到服務器的 header 信息private $…

大學php老師,php高校教師總結計劃系統

通過使用本系統,可以規范工作流程,提高辦公效率,增強團隊協同工作能力,實現科學的公文處理、事物管理、會議安排和人力管理,量化運營資源,預防管理真空,降低運行成本。還可以實現便利的信息發布…

好用的php空間,推薦國內三個優質的免費PHP空間

1.億家免費國內PHP空間這是我見過最好的免費國內PHP空間了,這個BLOG就是由他的空間支撐的,所以你看到我這個空間的穩定,快速就代表著他們空間的優質了,推薦注冊地址:www.e9china.net這個先要在他們論壇上發帖子&#x…

java處理臟數據,Java程序的臟數據問題

臟數據(Out-of-date data),指過時的數據。假如在您的java程序中存在臟數據,將或多或少地給軟件系統帶來一些問題,如:無法實時地應用已經發生改變的配置,軟件系統出現一些莫名其妙的、難以重現的、后果嚴重的錯誤等等。…

制作自己的 Docker 容器

軟件開發最大的麻煩事之一,就是環境配置。用戶必須保證操作系統的設置,各種庫和組件的安裝,只有它們都正確,軟件才能運行。docker從根本上解決問題,軟件安裝的時候,把原始環境一模一樣地復制過來。 以 koa-…

notepad php源碼,GitHub - CharlesKiki/Web-Notepad: 這是一個仿制有道云筆記的原生PHP小玩具。...

What is this?一個仿制筆記的Web應用。但是重點在于“重構”的樂趣。特點簡言之,不使用框架就以原生的語言來開發一個網站,最大的好處就是最實現方法的理解會加深。但是不適用框架也意味著重復和冗余,這也導致了項目閱讀時的閱讀思路。設計稿…

matlab機械手ikine函數,關于Mtalab-robotics工具箱中的fkine和ikine兩個函數的問題討論!...

clear;clc;L1 Link([-pi/2 0 0 0 0],standard);L2 Link([0 10 0 -pi/2 0],standard);L3 Link([0 9.5 0 0 0],standard);L4 Link([-pi/2 3.2 -pi/2 0 0],standard);L5 Link([0 0 0 14.5 0],standard);r SerialLink([L1 L2 L3 L4 L5]);%r.name 5R工業機械臂-上電姿態;q […

matlab差分算子的灰度圖像邊緣檢測,常用圖像邊緣檢測方法及MATLAB研究

論文2 1年 2月 I 01 5日現代電子技術M o e n El c r i sT e h qu d r e ton c c ni e第3 4卷第 4期Fe .2 11 b 0 Vo1 3 . . 4 NO 4常用圖像邊緣檢測方法及 Malb研究 t a韋煒(安文理學院,陜西西安西 706 ) 1 0 5({№噸~一~一一一三一一垂”. ; _堇;~~ _一…

mysql客戶端重置密碼是多少,mysql重置root密碼

你可以按照以下簡單的五步來重置/etc/init.d/mysql stop輸出:Stopping MySQL database server: mysqld./usr/bin/mysqld_safe --skip-grant-tables &輸出:[1] 5988Starting mysqld daemon with databases from /var/lib/mysqlmysqld_safe[6025]: sta…

go為什么比php性能好,剛學 GO,擼了個支付寶發券的程序,為什么性能還比不上 PHP ?...

下面是主程代碼,這是詳細代碼func main() {//解析參數filePath : flag.String("f", "", "文件路徑")tplId : flag.String("t", "", "模版 ID")flag.Parse()//解析密鑰pk, err : ParsePrivateKey()chec…