「黒馬プログラマ」ネットワークプログラミングUDP+TCP+HTTP
8532 ワード
and roid教育 javaトレーニングあなたとの交流を期待しています.
本编は、ネットワークプログラミングを学ぶノートで、ネットワークのモデル、ネットワーク通信の要素、ネットワーク通信の伝送プロトコルを绍介します.
下図の紹介は、ネットワークプログラミングの輪郭を簡単に紹介しています.
TCP,UDP,HTTP転送プロトコルを紹介します.これらのプロトコルを使って簡単なネットワーク転送操作ができます.
以下はマルチスレッド+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();
}
}