「黒馬プログラマ」ネットワークプログラミングUDP+TCP+HTTP

8532 ワード


and roid教育 javaトレーニングあなたとの交流を期待しています.
 
本编は、ネットワークプログラミングを学ぶノートで、ネットワークのモデル、ネットワーク通信の要素、ネットワーク通信の伝送プロトコルを绍介します.
下図の紹介は、ネットワークプログラミングの輪郭を簡単に紹介しています.
"黑马程序员 "网络编程UDP+TCP+HTTP_第1张图片 TCP,UDP,HTTP転送プロトコルを紹介します.これらのプロトコルを使って簡単なネットワーク転送操作ができます.
"黑马程序员 "网络编程UDP+TCP+HTTP_第2张图片 以下はマルチスレッド+UDPを使って簡単なチャットプログラムを実現する例示的なコードセグメント1です.
メッセージを送信し、メッセージを送信するジョブをスレッドのrunにカプセル化する().
package com.Chat;

import java.io.BufferedReader;

import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 *   UDP      。
 *   :
 * 1,  udp socket  。
 * 2,              。 
 * 3,  udp socket          。
 * 4,  socket  。
 */
public class Send implements Runnable{
	//1,udpsocket  。  DatagramSocket  。
	
private DatagramSocket  ds;
public Send(DatagramSocket ds){
	this.ds=ds;
}
	@Override
	public void run() {
		System.out.println("     !!");
		
			while (true){
				BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
				String line=null;
				try {
					while((line=buf.readLine())!=null){
						//2,              。
						byte []  bt=line.getBytes();
						DatagramPacket dp=new DatagramPacket(bt, bt.length, InetAddress.getByName("192.168.1.104") ,8888);
						ds.send(dp);
						if(line.equals("over"))break;
						
					}
				} catch (Exception e) {
				
					e.printStackTrace();
				}
				if(ds!=null)ds.close();	
			}	
		
	}

}
 送信メッセージを受信する.
 
package com.Chat;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
 *   UDP      。
 * 1,  udp socket  ,        ,          。
 * 2,     ,          。                 .
 * 3,  socket   receive               。
 * 4,                 。
 * 5,     
 */
public class Rece implements Runnable {
	
private DatagramSocket ds;
public Rece(DatagramSocket ds){
	this.ds=ds;
}
	@Override
	public void run() {
		System.out.println("     ");
		while(true){
			byte [] buf=new byte[1024];
			//2.     
			DatagramPacket dp=new DatagramPacket(buf, buf.length);
			try {
				// 3,                
				ds.receive(dp);
				// 4,          ,       ,  ,  ,  ,    。
				String ip=dp.getAddress().getHostAddress();
				int port =dp.getPort();
				byte [] bt=dp.getData();//    
				String data=new String(bt,0,dp.getLength());
				System.out.println(ip+"---"+port+":"+data);
				if(data.equals("over")){
					System.out.println(ip+"   ");
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}

}
 プログラムを起動して、チャットを実現します.
package com.Chat;

import java.net.DatagramSocket;
import java.net.SocketException;

public class chatTest {
	
	public static void main(String[] args) {
		try {
			DatagramSocket send=new DatagramSocket(10000);
			DatagramSocket rece=new DatagramSocket(8888);
			Thread t1=new Thread(new Send(send));
			Thread t2=new Thread(new Rece(rece));
			t1.start();
			t2.start();
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
 チャットプログラムはここで終わります.
 
以下の手順は、マルチスレッド技術+TCPを使用して、複数のクライアントのアップロード画像を処理する前のサービス端末の要求である.
以下はサービスの実現コードです.運行時にサービスを開始するべきです.
 
package com.TcpTest;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadPciServer {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		ServerSocket ss=new ServerSocket();
		
		while(true){
			Socket s=ss.accept();
			new Thread(new uploadTasd(s)).start();
		}

	}

}
 クライアントが複数のアップロードタスクを実行するにはマルチスレッドが必要ですので、アップロードファイルの操作をスレッドタスクにカプセル化します.
 
package com.TcpTest;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class uploadTasd implements Runnable {
	private Socket s;
	private static final int SIZE = 1024*1024*2;
	public uploadTasd(Socket s) {
		super();
		this.s = s;
	}

	@Override
	public void run() {
		
		try {
			//  Socket
			
			String ip=s.getInetAddress().getHostAddress();
			System.out.println(ip+"-----------connected");
			int count=0;
			
				File dir=new File("c:/upload");
				if(!dir.exists()){
					System.out.println(dir.mkdirs());
					
				}
				
				File file = new File(dir, ip + ".jpg");
				//             ,       
				while(file.exists()){
					file = new File(dir,ip+"("+(++count)+").jpg");
				}
				FileOutputStream fos = new FileOutputStream(file);
				BufferedOutputStream bos=new BufferedOutputStream(fos);
				BufferedInputStream bis=new BufferedInputStream(s.getInputStream());
				int len=0;
				while((len=bis.read())!=-1){
					bos.write(len);
					if(file.length()>SIZE){
						System.out.println(ip+"      ");
						
						bos.close();
						s.close();
						
						
						System.out.println(ip+"...."+file.delete());
						
						return ;
					}
				}
				OutputStream out=s.getOutputStream();
				out.write("    !".getBytes());
				bos.close();
			s.close();
		
			
		} catch (Exception e) {
			
			e.printStackTrace();
		}
		
	}

}
 以下はクライアントの実現コードです.
 
package com.TcpTest;


import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class UploadPicClient {

	/**
	 * @throws Exception 
	 * @throws UnknownHostException 
	 * 
	 */
	public static void main(String[] args) throws UnknownHostException, Exception {
		
		//  Socket     
			Socket s=new Socket("192.168.1.104",10000);
			FileInputStream fis=new FileInputStream(new File("c:/89.jpg"));
			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();//      :         。        
			//          
			byte [] btIn=new byte[1024];
			InputStream is=s.getInputStream();
			int lenIn=	is.read(btIn);
			String answer=new String(btIn, 0,lenIn);
			System.out.println(answer);
			fis.close();
			s.close();
	}

}