网络编程1

阅读更多

-网络编程概述
网络模型:1、OSI(Open System Interconnection 开放系统互连)参考模型
        2、TCP/IP 参考模型
网络通信要素:
1、IP地址
2、端口号
3、传输协议
-网络参考模型
OSI参考模型:应用层,表示层、会话层、传输层、网络层、数据链路层、物理层(分7层)
TCP/IP参考模型:应用层、传输层、网际层、主机至网络层(分4层)
-网络通信要素
IP地址:InetAddress
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
端口号
用于标识进程的逻辑地址,不同进程的标识
有效端口:0~65535,其中0~1024一般是系统使用或保留的端口
传输协议
通信的规则
常见协议:TCP/IP、UDP、
-TCP与UDP
TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、可用于传输大量数据 (流 模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
TCP协议常用于:Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协 议)。TCP用于传输数据量大,可靠性要求高的应用。
UDP:面向非连接、传输不可靠、用于传输少量数据(<64K数据包模式)、速度快。
UDP协议常用于:即时聊天应用、视频会议、桌面共享等。

-获取IP地址、主机名等信息的代码例子


package day23_NetworkProgramming;

import java.net.InetAddress;

//学习InetAddress
public class Day23_04_InetAddress {

	public static void main(String[] args) throws Exception {
		
		InetAddress i = InetAddress.getLocalHost();
		
		System.out.println(i.toString());
		System.out.println("address:"+i.getHostAddress());
		System.out.println("name:"+i.getHostName());
		
		
		InetAddress ia = InetAddress.getByName("www.baidu.com");
		System.out.println("address:"+ia.getHostAddress());
		System.out.println("name:"+ia.getHostName());
	}

}


-Socket概要
1、socket就是为网络服务提供的一种机制
2、通信两端都要有Socket
3、网络通信其实就是Socket间的通信
4、数据在两个socket间通过IO传输

-通过upd服务发送数据
需求:通过udp传输方式,将一段文件数据发送出去。
分析步骤:
1、建立updsocket服务
2、提供要发送的数据,并将数据封装到数据包中
3、通过socke服务的发送功能(send()方法),将数据发送出去
4、关闭资源
[b][/b]


import java.net.*;

public class Day23_07_UdpSendDemo {

	public static void main(String[] args) throws Exception {
		//1、创建upd服务,通过DatagramSocket对象
		DatagramSocket ds = new DatagramSocket();//可以给该程序指定一个端口
		
		//2、确定发送数,并封装成数据包。
		//DatagramPacket(byte[] buf,int length,InetAddress address,int port)
		byte[] buf = "data send by udp".getBytes();
		DatagramPacket dp = 
				new DatagramPacket(buf, buf.length, InetAddress.getByName("10.0.7.213"), 10000);
		
		//3、通过socket服务,使用send()方法将已有的数据包发送出去
		ds.send(dp);
		
		//4、关闭资源
		ds.close();

	}

}



-学习通过upd接收端接收数据
需求:定义一个应用程序,用于接收udp协议传输的数据并做相关处理。
分析步骤:
1、定义udp socket方法;通常会监听一个端口,作用其实就是方便于明确那些数据
过来是该应用程序可以处理的。
2、定义一个数据包,用于存储接收到的数据。(数据包中有更多功能可以提取字节数据
中的不同数据信息)
3、通过socke服务的receive()方法将接收到的数据存入已定义好的数据包中。
4、通过数据包对象的特有功能,将这些不同的数据去程,打印在控制台。
5、关闭资源


import java.net.*;

public class Day23_08_UdpReceiveDemo {

	public static void main(String[] args) throws Exception {
		//1、创建upd socket,建立端点
		DatagramSocket ds = new DatagramSocket(10000);//监听10000端口
		
		//2、定义数据包,用于存储数据
		byte[] buf = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf, buf.length);
		
		//3、通过服务的receive()方法将接收到的数据存入到数据包中
		ds.receive(dp);
		
		//4、通过数据包的方法获取其中的数据
		String ip = dp.getAddress().getHostAddress();
		String data = new String(dp.getData(),0,dp.getLength());
		int port = dp.getPort();
		
		System.out.println(ip+"::"+data+"::"+port);
		//5、关闭资源
		ds.close();

	}

}


-通过upd协议发送接收端接收数据方式二
接收端代码:


package day23_NetworkProgramming;

import java.net.*;

public class Day23_09_UdpReceiveDemo2 {

	public static void main(String[] args) throws Exception {
		
		DatagramSocket ds = new DatagramSocket(10001);
		
		while(true){
			
			byte[] buf = new byte[1024];
			DatagramPacket dp = new DatagramPacket(buf, buf.length);
			
			ds.receive(dp);
			
			String ip = dp.getAddress().getHostAddress();
			String data = new String(dp.getData(),0,dp.getLength());
			int port = dp.getPort();
			
			System.out.println(ip+"::"+data+"::"+port);
		}
	}
}




发送端代码:


package day23_NetworkProgramming;

import java.io.*; 
import java.net.*;
/**
 * 学习通过upd服务发送数据(通过键盘录入数据)
 * @author Administrator
 *
 */
public class Day23_09_UdpSendDemo2 {

	public static void main(String[] args) throws Exception {
		
		//1、创建upd服务,通过DatagramSocket对象
		DatagramSocket ds = new DatagramSocket();
		
		//2、确定发送数,并封装成数据包。
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = null;
		while((line=br.readLine())!=null){
			if("88".equals(line))
				break;
			byte[] buf = line.getBytes();
			DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("10.0.7.213"), 10001);
			
			//3、通过socket服务,使用send()方法将已有的数据包发送出去
			ds.send(dp);
		}
		
		//4、关闭资源
		ds.close();	
	}

}




练习:建立一个文本转换服务器,实现客户端给服务端发送文本,服务端将文本
转换成大写后返回给客户端。客户端可以不断的输入,当输入over时,
结束转换。

分析步骤:
1、建立服务
2、获取键盘录入数据
3、将数据发送给服务端
4、服务端给客户端返回转换后的数据
5、转换结束,关闭资源
接收端:


package day23_NetworkProgramming;

import java.net.*;
import java.io.*;


//服务端
class Day23_13_TCPTransPracticeServer {
	
	public static void main(String[] args) {
		ServerSocket ss = null;
		Socket s = null;
		try {
			ss = new ServerSocket(10005);
			s = ss.accept();
			
			//读取socket流中的数据
			BufferedReader socketBr = 
					new BufferedReader(new InputStreamReader(s.getInputStream()));
			
			//通过socket流 将转换后的数据发送回客户端
			//BufferedWriter socketBw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
			PrintWriter socketPw = new PrintWriter(s.getOutputStream(),true);
			
			String line = null;
			while((line=socketBr.readLine())!=null){
				
				System.out.println(line);
				//socketBw.write(line.toUpperCase());
				//socketBw.newLine();
				//socketBw.flush();
				
				socketPw.println(line.toUpperCase());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				s.close();
				ss.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
}




发送端:


package day23_NetworkProgramming;

import java.net.*;
import java.io.*;

//客户端
class Day23_13_TCPTransPracticeSend {
	
	public static void main(String[] args) {
		try {
			Socket s = new Socket("10.0.7.213", 10005);
			
			//定义读取键盘数据的流对象
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			
			//定义目的,将数据写入到socket输出流中,发送给服务端
			//BufferedWriter socketBw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
			PrintWriter socketPw = new PrintWriter(s.getOutputStream(),true);
			
			//定义一个socket读取流,读取服务端返回转换后的数据
			BufferedReader socketBr = new BufferedReader(new InputStreamReader(s.getInputStream()));
			
			String line = null;
			while((line=br.readLine())!=null){
				if("over".equals(line))
					break;
				//socketBw.write(line);
				//socketBw.newLine();
				//socketBw.flush();
				socketPw.println(line);
				
				//服务端返回转换后的数据
				String str = socketBr.readLine();
				System.out.println("server: "+str);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}



-练习:通过TCP的网络传输复制一个文本文件
具体代码如下:


package day23_NetworkProgramming;

import java.net.*;
import java.io.*;

//服务端
class Day23_14_CopyByTCPPracticeServer {
	
	public static void main(String[] args) throws Exception {
		ServerSocket ss = new ServerSocket(10006);
		Socket s = ss.accept();
		
		//显示客户端连接的ip
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+"......connected");
		
		BufferedReader socketBr = 
				new BufferedReader(new InputStreamReader(s.getInputStream()));
		
		PrintWriter pw = new PrintWriter(new FileWriter("copyByTCP.txt"),true);
		
		String line = null;
		while((line=socketBr.readLine())!=null){
			pw.println(line);
		}
		PrintWriter socketPw = new PrintWriter(s.getOutputStream(),true);
		socketPw.println("上传成功");
		
		pw.close();
		s.close();
		ss.close();
	}
	
}





package day23_NetworkProgramming;

import java.net.*; 
import java.io.*;

//客户端
class Day23_14_CopyByTCPPracticeClient {
	
	public static void main(String[] args) throws Exception {
		Socket s = new Socket("10.0.7.213",10006);
		
		BufferedReader br = new BufferedReader(new FileReader("demo.txt"));
		
		PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
		
		String line = null;
		while((line=br.readLine())!=null){
			pw.println(line);
		}
		s.shutdownOutput();
		
		BufferedReader socketBr = 
				new BufferedReader(new InputStreamReader(s.getInputStream()));
		String str = socketBr.readLine();
		System.out.println(str);
		
		br.close();
		pw.close();
		s.close();
		
	}
	
}

你可能感兴趣的