Java中的基於Tcp協議的網絡編程


 

一:網絡通信的三要素?

IP地址       端口號       通信協議

IP地址:是網絡中設備的通信地址。由於IP地址不易記憶,故可以使用主機名。本地環回地址,127.0.0.1   本地主機名localhost

端口號:發送端准備的數據要發送到指定的目的應用程序上,為了標識這些應用程序,所以用網絡數字來標識這些不同的應用程序,這些數

字稱為端口號。端口號是不同進程之間的標識。一般來說,有0~65535的端口可供使用,但是1~1024系統使用,或者稱作保留端口。

通信協議:指定義的通信規則,這個規則稱為協議。國際組織定義了通用TCP/IP協議。我們常見的通信協議有TCP 協議   UDP協議

二:Java中基於TCP協議的網絡編程?

首先,我們需要了解TCP協議的一些基本特點:

TCP協議,是面向連接的可靠協議。在數據傳輸前,必須先建立雙方的連接,所以說是面向連接的。在建立的連接中,可以進行大數據量的傳輸。而且,tcp協議通過三次握手完成連接,所以說是可靠的協議。同時,傳輸效率比較低。

接下來我們得清楚TCP協議下的網絡編程的編程思路:

需要用到兩個類:Socket(實現客戶端套接字)和ServerSocket(實現服務器套接字)

 客戶端:

           准備好要發送的數據包

    創建客戶端的套接字,與服務器端建立連接

           調用Socket的方法來發送數據報包

      關閉套接字

服務器端:

   准備接收數據客戶端建立連接

      創建服務器的套接字,並且與客戶端建立連接

   調用ServerSocket的方法來接受數據

      關閉套接字

三:實例如下

實現基本的客戶端的與服務器之間的通信。

客戶端代碼:

package com.itycl.net;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClientDemo1 {

    public static void main(String[] args) throws Exception {
            
        Socket s=new Socket("192.168.3.109",8833);//建立連接,綁定目的應用程序的IP地址和端口號
        
        OutputStream oo=s.getOutputStream();//調用getOutputStream()來發送數據
        
        BufferedWriter ow=new BufferedWriter(new OutputStreamWriter(oo));//把要發送的數據寫到緩沖區
        
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//讀取鍵盤中輸入的數據
        
        
        String  line=null;
        
        while((line=br.readLine())!=null) {
            
            ow.write(line);
            ow.newLine();
            ow.flush();
            
        }
    }
    
}


 

 服務器端代碼:

package com.itycl.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServerDemo1 {
public static void main(String[] args) throws Exception {
       
    ServerSocket ss=new ServerSocket(8833);//建立服務器端然套接字
    
    Socket s=ss.accept();//調用accept方法接受並且監聽連接
    
    InputStream is=s.getInputStream();//調用getInputStream()來接收數據
    
    BufferedReader br=new BufferedReader(new InputStreamReader(is));
    
    String ip=s.getInetAddress().getHostAddress();
    
    String line=null;
    
    while((line=br.readLine())!=null) {
        
        byte[] buf=line.getBytes();
        
        String data=new String(buf,0,buf.length);
        
        System.out.println(ip +"  :  "+data);
    }    
}
}

四.實現客戶端與服務器的通信,並且將聊天記錄保存在某個盤符下。

要求:可循環發送接收消息,並且保存的聊天記錄中要有IP地址+時間+接收的數據,且,要求在一個Java文件中實現。

實例代碼:

package com.itycl.net;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TcpClientAndServerDemo {
public static void main(String[] args)  {
    new Thread(new Client()).start();
    try {Thread.sleep(30);}catch(Exception e) {}
    new Thread(new Server()).start();
    
}
}

class  Client implements Runnable{

    @Override
    public void run() {
        try {
            Socket s=new Socket("localhost",8962);
            OutputStream os = s.getOutputStream();
            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            String line=null;
            while((line=br.readLine())!=null) {
                byte[] buf=line.getBytes();
                String data=new String(buf,0,buf.length);
                bw.write(data);
                bw.newLine();
                bw.flush();
            }
          bw.close();                
        }catch(Exception e) {}
        
    }
    

        
}

class Server implements Runnable{

    @Override
    public void run() {
     try {
            ServerSocket ss=new ServerSocket(8962);
            Socket s = ss.accept();
            InputStream is = s.getInputStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String line=null;
            while((line=br.readLine())!=null) {
                byte[] buf=line.getBytes();
                String data=new String(buf,0,buf.length);
                String ip=s.getInetAddress().getHostAddress();
                SimpleDateFormat sdft=new SimpleDateFormat("HH:MM:s");//格式化日期
                Date date=new Date();
                String format = sdft.format(date);
                System.out.println(ip+" : "+format+" : "+data);//輸出數據
            
                BufferedWriter  bw=new BufferedWriter(new FileWriter("E://liaotianjilu.txt",true)); //將聊天記錄保存到E盤
                bw.write(ip+" : "+format+" : "+data);
                bw.newLine();
                bw.flush();    
            
            }
        }catch(Exception e) {}
        
    }
    
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM