1. 程式人生 > >TCP通訊中,BufferedWriter和PrintWriter用來實現輸出流的實現方式與區別

TCP通訊中,BufferedWriter和PrintWriter用來實現輸出流的實現方式與區別

區別:
1. PrintWriter的print、println方法可以接受任意型別的引數,而BufferedWriter的write方法只能接受字元、字元陣列和字串;
2. PrintWriter的println方法自動新增換行,BufferedWriter需要顯示呼叫newLine方法;
3. PrintWriter的方法不會拋異常,若關心異常,需要呼叫checkError方法看是否有異常發生;
4. PrintWriter構造方法可指定引數,實現自動重新整理快取(autoflush);
5. PrintWriter的構造方法更廣。
網路TCP程式設計中,可以使用PrintWriter,也可以使用BufferedWriter,程式碼如下:
伺服器端:

package TCP;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

public class MyTcp {
        private BufferedReader reader;
        private ServerSocket server;
        private Socket socket;
        void getserver(){
            try
{ server=new ServerSocket(8998); System.out.println("伺服器套接字已經建立成功"); while(true) { System.out.println("等待客戶機連線"); socket=server.accept(); reader=new BufferedReader(new InputStreamReader(socket.getInputStream())); getClientMessage(); } } catch
(IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void getClientMessage() { // TODO Auto-generated method stub try { while(true) { System.out.println("客戶機:"+reader.readLine()); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { if(reader!=null) reader.close(); if(socket!=null) socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String args[]) { MyTcp tcp = new MyTcp(); tcp.getserver(); } }

客戶端:

package 網路通訊客戶端;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;

public class MyClient extends JFrame{
    private BufferedWriter writer;
    //private PrintWriter writer;
    Socket socket;
    private JTextArea ta = new JTextArea();
    private JTextField tf=new JTextField();
    Container cc;
    public MyClient(String title)
    {
        super(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        cc=this.getContentPane();
        final JScrollPane scrollPane=new JScrollPane();
        scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
        getContentPane().add(scrollPane,BorderLayout.CENTER);
        scrollPane.setViewportView(ta);
        cc.add(tf,"South");
        tf.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                try {
                writer.write(tf.getText());
                writer.newLine();
                writer.flush();//使用BufferedWriter和PrintWriter都行,後者更方便,PrintWriter擁有跨平臺的換行符輸入,且自動重新整理。
                //writer.println(tf.getText);
                ta.append(tf.getText()+'\n');
                ta.setSelectionEnd(ta.getText().length());
                tf.setText("");
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        });
    }
    private void connect(){
        ta.append("嘗試連線\n");
        try {
            socket = new Socket("127.0.0.1",8998);
            writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //writer=new PrintWriter(socket.getOutpuStream());
            ta.append("完成連線");
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
    public static void main(String args[])
    {
        MyClient client = new MyClient("向伺服器傳送資料");
        client.setSize(200,200);
        client.setVisible(true);
        client.connect();

    }
}

相關推薦

TCP通訊BufferedWriterPrintWriter實現輸出實現方式區別

區別: 1. PrintWriter的print、println方法可以接受任意型別的引數,而BufferedWriter的write方法只能接受字元、字元陣列和字串; 2. PrintWriter的println方法自動新增換行,BufferedWrite

TCP協議ClientServer是如何通訊的?三次握手第一次傳送的內容是什麼?

原博主加入了很多抓包圖來解釋這個過程,鄙人看不懂抓包的內容,不過大致流程還是看明白了,所以就把抓包部分給去掉了,覺得會好理解一些。 TCP/IP協議分層 這個問題就要從TCP/IP協議說起了,先來看看TCP/IP協議是如何分層的。 鏈路層

在活動目錄轉移操作主機角色(占

操作主機 ad 轉移 占用 楊書凡 如何占用操作主機操作主機是ActiveDirectory中的特殊對象,具備操作主機角色的域控制器擔任著活動目錄核心功能,如果操作主機不可用,整個活動目錄都會出現異常,甚至崩潰。 操作主機角色的唯一性決定了不是任意一臺域控制器都能管理整個域,當一臺承

delphiwriteread的用法?什麼時候需要

如你所說,在控制元件或者類的屬性中,read 表示 讀取,write 則表示設定。比如在類中:TTestClass = (Class)privateFOrderCode:String;publicproperty OrderCode:String read FOrderCode write FOrd

Nginx配置try_files“@”符號得妙

今天研究了一下Nginx反向代理配置,其中有一段程式碼 loaction / { try_files $uri @apache } loaction @apache{ proxy_pass http://127.0.0.1:88 include aproxy.conf }

form表單提交確定取消效果的實現

前端開發中的資料提交,目前大多數採用表單提交的方式,但是對於很對初學者來說,只知道在表單格式中,只有一個<input type="submit">,如果有兩個或者要求有多個提交選擇的時候應該怎麼做呢,其實用js就可以簡單實現: 例如下面的效果: 有一個確定和取消的

javascript && || 妙

前言:幾乎所有的語言中,都有&&和||,a&&b 中如果a為false則後面不執行,c||d中如果c為true則後面不執行. 在js中可利用該特性,進行以下妙用: 1.&& 看如下程式碼: if(a > 4) { alert('Hel

android IPC通訊的UIDPID識別

  IPCThreadState物件維護了2個變數             pid_t      

在prootbuf StringQByteArray互相轉換

在做專案中,應用到protobuf,通訊採用的是TCP,開發平臺是Linux和Windows下的Qt5.11.2。由於Qt TCP傳輸資料型別是QByteArray,而protobuf需要將資料轉換成string。 在正常使用過程中,QByteArray和string都可以採用以下方式進

程序通訊鍵值識別符號的關係

在建立一個訊息佇列(其他ipc相同)時,需要先通過檔案路徑名和專案ID獲取一個鍵值,然後通過此鍵值由核心生成識別符號,在以後可通過此識別符號來使用此訊息佇列。 為什麼要有鍵值和識別符號兩個值呢?         描述符是對於使用者操作而言的,讓使

http協議“get”“post”的區別是什麼?

http協議中,“get”和“post”的區別是什麼? GET和POST是HTTP請求的兩種基本方法,要說它們的區別,接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把引數包含在URL中,POST通過request body傳遞引數。 你可能自己寫過無數個GET和POST請

串列埠通訊解決serialport.DataReceived接收到的資料不完整

private SerialPort serialport = new SerialPort(); private StringBuilder builder = new StringBuilder(); // private String

Java的trim()函式是幹什麼的?(ltrim()rtrim()的定義)

Trim函式是用來去除String字串的前後空白符號或者預定義字元; 同理:ltrim即left+trim(),去除左側的空白符號或者預定義字元;rtrim即right+trim()去除右側空白符號或者預定義字元; public static void main(String[] args)

python-numpy.arrayany()all()方法介紹

0.摘要 本文主要介紹numpy.array.any()和numpy.array.all()的用法和區別。 1.np.array.any()和numpy.array.all() np.array.any()是或操作,將np.array中所有元素進行或操作,然後返回T

springrefidref標籤之間的區別

ref和idref標籤在定義上的區別: idref標籤:注入的是目標bean的id,同時使用idref容器在部署的時候還會驗證這個名稱的bean是否真實存在。idref就跟value一樣,只是將某個字串注入到屬性或者建構函式中,只不過注入的是某個Bean定義的id屬性值。

在try-catch-finally語句returnfinally的關係

public class TestTryCatch { public static void main(String[] args) { TestTryCatch test = new TestTryCatch(); int fun = test.fun();

Linux.a.so其實就是靜態連結庫動態連結庫

詳細查了一下,.a與.so的區別,其實就是靜態連結庫與動態連結庫。有一篇博文,很詳細,附上鍊接:http://blog.csdn.net/nieyinyin/article/details/6890557   Linux下的.so是基於Linux下的動態連結,其功能和作用類

HibernatemappedBy註解@JoinColumn的對比

mappedBy 我們知道,mappedBy用於指定具有雙向關係的兩個實體中。哪個實體是被關聯處理的。它有如下四個特點: 1.只有OneToOne,OneToMany,ManyToMany上才有mappedBy屬性,ManyToOne不存在該屬性; [email&#

Android屬性動畫完全解析 ValueAnimatorObjectAnimator的高階用法

轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章當中,我們學習了Android屬性動畫的基本用法,當然也是最常用的一些用法,這些用法足以覆蓋我們平時大多情況下的動畫需求了。但是,正如上篇文章當中所

MyBatis Generator生成的CRUD操作insertSelectiveinsert的區別

專案需要需要使用MyBatis Generator,generator可生成以下幾種的CURD操作。 1.insert() 2.insertSelective() 3.updateByPrimaryKeySelective() 4.updateByPrimaryKey() 5.s