網絡編程日記(一)

小白級程序員 還在學習,前幾天剛剛開始在跟着老師做網絡編程,記錄一下學習過程

 

基於Python網絡編程學習
製作路徑:
1. Socket通訊 雙向通訊
    TCP
    UDP
2. 遠程對象 Pyro
    https://python-parallel-programmning-cookbook.readthedocs.io/zh_CN/latest/chapter5/06_Remote_Method_Invocation_with_Pyro4.html
3. SOA
    Web Service: https://pypi.org/project/Flask-Spyne/
        wsdl
        uddi
        soap
    REST: https://www.django-rest-framework.org/
4. Web三層
    Django(MVC) + MySql
5. Ajax
    jQuery + Django
6. 新浪雲 Django: 
7. Gitee部署

以上是老師給出的學習路徑及文檔地址

正在製作第一部分,目標是基於java與Python完成TCP及UDP簡單雙向通訊實驗昨天開始到現在寫(chao)完Java部分

#學習自csdn學院李興華老師Java核心技術網絡編程部分

基於java TCP網絡通訊編程分爲兩部分:

          客戶端部分與服務端部分。

工作過程:服務端監聽特定端口,接收客戶端發來消息,然後把接收到的消息增加一部分返回至客戶端打印輸出。

1.客戶端(Socket)

java提供有java.net.Socket;創建客戶端對象  

  • public Socket(String host,int port)throws UnknownHostException,IOException //Socket類構造函數host(服務端地址)port(服務端所監聽的端口)
    

Socket client = new Socket("localhost",9999);//創建客戶端對象從9999端口發送消息

客戶端對象建立完畢 接下來進行兩項工作

    第一 發送字符串到客戶端

    第二接收客戶端發來的字符串並打印

在Socket類中有兩個類 一個是輸入流一個是輸出流

client.getInputStream();client.getOutputStream();

第一   發送字符串到客戶端(output)

客戶端發送數據到服務端

然後利用Scanner,用戶就可以從鍵盤輸入到客戶端 客戶端送到服務端

       Scanner input = new Scanner(System.in); //鍵盤輸入對象
       PrintStream output = new PrintStream(client.getOutputStream()) ;//output對象 用來把字符串送到服務端

       String str = input.next().trim();  //接收鍵盤 存到str中
       output.println(str);                    //送到服務端

第二   接收客戶端發來的信息(input)

      客戶端利用input方法接收數據就可以完成從服務端到客戶端接收 然後打印

     Scanner in = new Scanner(client.getInputStream());//用於接收數據

     System.out.println(in.next().trim());//打印接收到的數據

完整代碼展示

import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class HellwClient {
	public static void main(String[] args)  throws Exception{
		Socket client = new Socket("localhost",9999);
		Scanner input = new Scanner(System.in); //鍵盤輸入
		Scanner in = new Scanner(client.getInputStream());
		in.useDelimiter("\n");
		input.useDelimiter("\n");
		PrintStream output = new PrintStream(client.getOutputStream()) ;
		boolean flag = true;
		while(flag) {
			System.out.print("請輸入數據");
			if(input.hasNext()) {   					//鍵盤緩存區還有數據
				String str = input.next().trim();
				output.println(str);					//送到服務端
				if(in.hasNext()) {
					System.out.println(in.next().trim());
				}
				if("byebye".equalsIgnoreCase(str)) {
					flag = false;
					
				}
			}
		}
		client.close();
 	}
}

2.服務端(ServerSocket)

java提供有java.net.ServerSocket;創建服務端對象  

  • public ServerSocket(int port)throws IOException //ServerSocket類構造函數 port爲監聽端口

ServerSocket server = new ServerSocket(9999); //創建服務端對象監聽9999端口

然後被動等待客戶端連接:Socket client = server.accept();//等待一個客戶端連接進來

到此爲止,客戶端實例等待連接部分建立完畢;

接下來就是兩件事情。

    第一:接收用戶所發送的字符串。

    第二:增加一部分字符串然後返回給用戶。

第一 接收用戶所發送的字符串

    Scanner scan = new Scanner(client.getInputStream());

    #####在服務端中 有一個Socket對象,客戶端中也有一個Socket對象,客戶端的Socket送到服務端Socket,所以在服務端是input方法獲得送來的字符串(自己的理解,有錯請指出)#########

    String str = scan.next().trim();//接收字符串保存到str中

第二 發送字符串回客戶端

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

    out.println("123:"+str);//與上一部分同理 利用服務端Socket對象output返回字符串至客戶端Socket對象

至此一對一通訊完成

然後如果多人同時通訊就需要多線程支持,把主體IO部分創建一個新的線程,即可完成多客戶端同時通訊。

完整代碼展示

import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class HellowServer {
	public static void main(String args[]) throws Exception {
		ServerSocket server = new ServerSocket(9999);
		boolean outflag = true;
		while(outflag) {
			System.out.println("等待客戶連接");
			Socket client = server.accept();
			new Thread(()->{
				try {
					Scanner scan = new Scanner(client.getInputStream());
					scan.useDelimiter("\n");
					PrintStream out = new PrintStream(client.getOutputStream());
					boolean flag = true;
					while(flag) {		//一直進行
						if(scan.hasNext()) {
							String str = scan.next().trim();
							if("byebye".equalsIgnoreCase(str)) {
								flag = false;
								out.println("您已退出系統,byeye");
							}else {
								out.println("123:"+str);			//不是byebye 那就加上123返回
							}
						}
					}
				}catch (Exception e) {
					
				}
				
			}).start();
		}
		
	}

###新人發帖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章