Java学习日志(23-3-网络编程-TCP)
生活随笔
收集整理的這篇文章主要介紹了
Java学习日志(23-3-网络编程-TCP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么80%的碼農都做不了架構師?>>> ??
TCP傳輸
? ? 建立客戶端和服務器端
? ? 建立連接后通過Socket中IO流進行數據傳輸
? ? 關閉socket
*客戶端Socket與服務器端ServerSocket是兩個獨立的應用
/* TCP傳輸 TCP分為客戶端和服務端 客戶端對應對象是Socket 服務端對應對象是ServerSocket客戶端:在該對象建立時,就可以連接指定主機因為TCP是面向連接的,所以在建立服務時,需要有服務官存在并連接成功形成通路后,在該通道進行數據的傳輸 給服務端發(fā)送文本數據1.創(chuàng)建Socket服務,并指定要連接的主機和端口*/import java.io.*;import java.net.*;class TCPClient{public static void main(String[] args)throws Exception{// 創(chuàng)建客戶端的socket服務,指定目的主機和端口Socket s=new Socket("192.168.1.1",10003);// 為了發(fā)送數據,應該獲取socket流中的輸出流OutputStream out=s.getOutputStream();out.write("tcp".getBytes());s.close();}}/* 服務端 1.建立服務端的Socket服務,ServerSocket();并監(jiān)聽一個端口 2.獲取連接的客戶端對象,通過accept方法,沒有連接就會等,屬于阻塞式 3.如果客戶端發(fā)來數據,服務端使用對應的客戶端對象,并獲取到該對象的讀取流 4.關閉服務器*/class TCPServer{public static void main(String[] args)throws Exception{// 建立服務端Socket服務,監(jiān)聽端口ServerSocket ss=new ServerSocket(10003);// 通過accept獲取對象Socket s=ss.accept();String ip=s.getInetAddress().getHostAddress();System.out.println(ip+"....connected");// 使用客戶端對象的讀取流來讀取數據InputStream in=s.getInputStream();byte[]buf=new byte[1024];int len=in.read(buf);System.out.println(new String(buf,0,len));s.close();//關閉客戶端ss.close();//關閉服務端}}客戶端與服務器互訪
/* 演示TCP客戶端和服務端的互訪 客戶端給服務端發(fā)送數據,服務端收到后給客戶端反饋信息客戶端: 1.建立Socket服務,指定連接主機和端口 2.獲取Socket的輸出流,將數據寫到流中,通過網絡發(fā)送給服務端 3.獲取Socket流中的輸入流,將服務端反饋的數據并獲取打印 4.關閉資源*/ import java.io.*; import java.net.*; class TCPClient2{public static void main(String[] args)throws Exception{Socket s=new Socket("192.168.1.135",10004);OutputStream out=s.getOutputStream();out.write("服務端,你好".getBytes());InputStream in=s.getInputStream();byte[]buf=new byte[1024];int len=in.read(buf);System.out.println(new String(buf,0,len));s.close();} } class TCPServer2{public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(10004);Socket s=ss.accept();String ip=s.getInetAddress().getHostAddress();System.out.println(ip+"...connected");InputStream in=s.getInputStream();byte[]buf=new byte[1024];int len=in.read(buf);System.out.println(new String(buf,0,len));OutputStream out=s.getOutputStream();out.write("收到,你好".getBytes());s.close();ss.close();} }練習
/* 文本轉換服務器 客戶端給服務端發(fā)送文本,服務端將文本轉換成大寫返回給客戶端 客戶端可以不斷進行文本裝換,輸入over時結束客戶端既然是操作設備上的數據,可以使用并按照IO技術來思考源-鍵盤錄入目的-網絡設備,網絡輸出流操作的是文本數據,可以選擇字符流1.建立服務2.獲取鍵盤錄入3.發(fā)給服務端4.返回大寫數據5.關閉資源都是文本數據,可以使用字符流操作,同時提高效率,加入緩沖*/import java.io.*;import java.net.*;class TrainsClient{public static void main(String[] args)throws Exception{Socket s=new Socket("192.168.135",10024);// 定義讀取鍵盤數據的流對象BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));// 定義目的,將數據寫入Socket輸出流,發(fā)給服務端// BufferedWriter bufOut=// new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));PrintWriter out=new PrintWriter(s.getOutputStream(),true);// 定義一個Socket讀取流,讀取服務端返回的大寫信息BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));String line=null;while((line=bufr.readLine())!=null){if("over".equals(line)){break;}out.println(line);// bufOut.write(line);// bufOut.newLine();// bufOut.flush();String str=bufIn.readLine();System.out.println("server:"+str);}bufr.close();s.close();}}/* 服務端 源-socket讀取流 目的-socket輸出流 都是文本,裝飾*/class TrainsServer{public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(10024);Socket s=ss.accept();String ip=s.getInetAddress().getHostAddress();System.out.println(ip+".....connected");// 讀取Socket讀取流BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));// 目的Socket輸出流,將大寫數據寫入Socket輸出流并發(fā)送給客戶端// BufferedWriter bufOut=// new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));PrintWriter out=new PrintWriter(s.getOutputStream(),true);String line=null;while((line=bufIn.readLine())!=null){System.out.println(line);out.println(line.toUpperCase());// bufOut.write(line.toUpperCase());// readLine必須讀到回車才會停止,必須添加結束標志// bufOut.newLine();// bufOut.flush();}s.close();ss.close();}}/* 該例出現的問題:現象-客戶端與服務端都在等待客戶端和服務端都有阻塞式的方法,這些方法沒有讀到結束標記就會一直等*/TCP上傳文件
import java.io.*; import java.net.*; class TextClient{public static void main(String[] args)throws Exception{Socket s=new Socket("192.168.1.135",10006);BufferedReader bufr=new BufferedReader(new FileReader("IPDemo.java"));PrintWriter out=new PrintWriter(s.getOutputStream(),true);// 加入時間戳// DataOutputStream dos=new DataOutputStream(s.getOutputStream());// long time=System.currentTimeMillis();// out.println(time);// dos.writeLong(time);String line=null;while((line=bufr.readLine())!=null){out.println(line);}// dos.writeLong(time);// out.println("");s.shutdownOutput();// 關閉客戶端輸入流,相當于-1BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));String str=bufIn.readLine();System.out.println(str);bufr.close();s.close();} } class TextServer{public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(10006);Socket s=ss.accept();String ip=s.getInetAddress().getHostAddress();System.out.println(ip+".....connected");// DataInputStream dis=new DataInputStream(s.getInputStream());// long l=dis.readLongBufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));PrintWriter out=new PrintWriter(new FileWriter("server.txt"),true);String line=null;while((line=bufIn.readLine())!=null){// if("over".equals(line)){// break;// }out.println(line);}PrintWriter pw=new PrintWriter(s.getOutputStream(),true);pw.println("上傳成功");out.close();s.close();ss.close();} }TCP上傳圖片
/* 上傳圖片 客戶端 1.服務端點 2.讀取客戶端已有的圖片數據 3.通過Socket輸出流將數據發(fā)給服務端 4.讀取服務端反饋信息 5.關閉*/import java.io.*;import java.net.*;class PicClient{public static void main(String[] args)throws Exception{Socket s=new Socket("192.168.1.135",10007);FileInputStream fis=new FileInputStream(1.bmp);OutputStream out=s.getOutputStream();byte[]buf=new byte[1024];int len=0;while((len=fis.read(buf))!=-1){out.write(buf,0,len);}s.shutdownOutput();InputStream in=s.getInputStream();byte[]bufIn=new byte[1024];int num=in.read(bufIn);System.out.println(new String(bufIn,0,num));fis.close();s.close();}} /* 這個服務端有個局限性,當A客戶端連接上以后,被服務端獲取,服務端執(zhí)行流程 這時B客戶端只能等待 服務端還沒有處理完A客戶端的請求,還沒有循環(huán)回來,執(zhí)行下一次accept() 所以暫時不能獲取B對象 為了讓多個客戶端同時訪問,服務端將每個客戶端封裝到單獨的線程中 */class PisServer{public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(10007);Socket s=ss.accept();InputStrream in=s.getInputStream();FileOutputStream fos=new FileOutputStream("server.bmp");byte[]buf=new byte[1024];int len=0;while((len=in.read(buf))!=-1){fos.write(buf,0,len);}OutputStream out=s.getOutputStream();out.write("上傳成功".getBytes());fos.close();s.close();ss.close();}}TCP上傳圖片-多人上傳
/* 上傳圖片 客戶端 1.服務端點 2.讀取客戶端已有的圖片數據 3.通過Socket輸出流將數據發(fā)給服務端 4.讀取服務端反饋信息 5.關閉*/import java.io.*;import java.net.*;class PicClient{public static void main(String[] args)throws Exception{if(args.length!=1){System.out.println("請選擇一個jpg格式的圖片");return;}File file=new File(args[0]);if(!(file.exists()&&file.isFile())){System.out.println("改文件有問題");return;}if(!(file.getName().endsWith(".jpg"))){System.out.println("圖片格式錯誤");return;}if(file.length()>1024*1024*5){System.out.println("文件過大");return;}Socket s=new Socket("192.168.1.135",10007);FileInputStream fis=new FileInputStream(file);OutputStream out=s.getOutputStream();byte[]buf=new byte[1024];int len=0;while((len=fis.read(buf))!=-1){out.write(buf,0,len);}s.shutdownOutput();InputStream in=s.getInputStream();byte[]bufIn=new byte[1024];int num=in.read(bufIn);System.out.println(new String(bufIn,0,num));fis.close();s.close();}}/* 定義線程 明確每一個客戶端需要在服務端執(zhí)行的代碼即可,將之存入run();*/ class PicThread implements Runnable{private Socket s;PicThread(Socket s){this.s=s;}public void run(){int count=0;String ip=s.getInetAddress().getHostAddress();try{System.out.println(ip+"....connected");InputStream in=s.getInputStream();File file=new File(ip+"("+(count)+")"+".jpg");while(file.exists()){file=new File(ip+"("+(count++)+")"+".jpg");}FileOutputStream fos=new FileOutputStream(file);byte[]buf=new byte[1024];int len=0;while((len=in.read(buf))!=-1){fos.write(buf,0,len);}OutputStream out=s.getOutputStream();out.write("上傳成功".getBytes());fos.close();s.close();}catch(Exception e){throw new RuntimeException(ip+"上傳失敗");}}}class PicServer{public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(10007);while(true){Socket s=ss.accept();new Thread(new PicThread(s)).start();}// ss.close();}}TCP-并發(fā)登錄
/* 客戶端通過鍵盤錄入用戶名 服務端對這個用戶名進行校驗如果該用戶存在,在服務端顯示xxx已登錄 并在客戶端顯示xxx歡迎光臨如果該用戶不存在,在服務端顯示xxx嘗試登陸 并在客戶端顯示該用戶不存在最多登陸三次*/import java.io.*;import java.net.*;class LoginClient{public static void main(String[] args)throws Exception{Socket s=new Socket("192.168.1.135",10008);BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));PrintWriter out=new PrintWriter(s.getOutputStream(),true);BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));for(int x=1;x<=3;x++){String line=bufr.readLine();if(line==null){break;}out.println(line);String info=bufIn.readLine();System.out.println("info:"+info);if(info.contains("歡迎")){break;}}bufr.close();s.close();}}class UserThread implements Runnable{private Socket s;UserThread(Socket s){this.s=s;}public void run(){String ip=s.getInetAddress().getHostAddress();System.out.println(ip+"....connected");try{for(int x=1;x<=3;x++){BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));String name=bufIn.readLine();BufferedReader bufr=new BufferedReader(new FileReader("user.txt"));PrintWriter out=new PrintWriter(s.getOutputStream(),true);String line=null;boolean flag=false;while((line=bufr.readLine())!=null){if(name==null){break;}if(line.equals(name)){flag=true;break;}if(flag){System.out.println(name+"已登錄");out.println(name+"歡迎光臨");break;}else{System.out.println(name+"嘗試登錄");out.println(name+"該用戶不存在");break;}}}s.close();}catch(Exception e){throw new RuntimeException(ip+"校驗失敗");}}}class LoginServer{public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(10008);while(true){Socket s=ss.accept();new Thread(new UserThread(s)).start();}}}?
轉載于:https://my.oschina.net/Almon/blog/775532
總結
以上是生活随笔為你收集整理的Java学习日志(23-3-网络编程-TCP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Debian及树莓派改时间
- 下一篇: Lesson3 Shader着色器