黑马程序员_网络编程

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


网络编程:


网络通讯要素:

1、IP地址

2、端口号

3、传输协议

IP地址:

  (1)、它是网络中的设备标识 //每台主机都有自己的IP地址,这样才能将数据发送到指定的地方

        (2)、不易记忆,可用主机名表示,两者存在映射关系 //如:www.baidu.com

        (3)、本机回环地址:127.0.0.1,主机名为:localhost

Java将IP地址封装成了一个对象,存在于java.net包中:InetAddress类

InetAddress类常用方法:

1、getLocalHost()此方法是静态的,可以获取InetAddress对象

2、static InetAddress getByName(String host)获取指定主机的IP和主机名

3、getHostAddress:获取本地地址

示例:

<span style="font-size:18px;">import java.net.InetAddress;


public class IPDemo {

	public static void main(String[] args) throws Exception {
		//static InetAddress getLocalHost()   返回本地主机地址和名称。
		InetAddress i = InetAddress.getLocalHost();
		System.out.println(i.toString());
		
		//获取本地IP地址(最为常用)
		String IPAddress = i.getHostAddress();
		
		//获取本地主机名称
		String HostName = i.getHostName();
		
		//获取任意一台主机IP地址
		//static InetAddress getByName(String host) 
		InetAddress ia = InetAddress.getByName("www.baidu.com");
		System.out.println(ia.toString());
		
		

	}

}
</span>
端口号:

1、数据要发送到对方指定的应用程序上。为了标识这些应用程序,所以给这些网络应用程序(例如QQ)都用数字进行标识,为了方便称呼这个数字,叫做端口(逻辑端口)。

2、用于标识进程的逻辑地址,不同进程的标识不同

3、有效端口:0~65535,其中0~1024端口为系统使用或保留端口。

注意:进行通信连接时,一定要指定端口才能发送到对方指定的应用程序上。

网络模型:OSI参考模型和TCP/IP参考模型

OSI参考模型分为:应用层,表示层,会话层,传输层, 通信层,网络层,数据链路层,物理层;

TCP/IP参考模型简化了OSI参考模型。只分为:应用层,传输层,网际层,主机至网络层,一般来说开发处于传输层和网际层,应用层为:FTPHTTP协议等,传输层为:UDPTCP等,网际层为:IP

通常用户操作的是应用层,而编程人员需要做的是传输层和网际层,用户在应用层操作的数据,经过逐层封包,最后到物理层发送到另一个模型中,再进行逐层解包。

传输协议:

通信规则,最常用的协议为:TCPUDP协议



Socket   

1,什么是Socket

网络服务提供的一种机制,通信两端都要有Socket,才能进行数据的传输,数据在两个Socket间通过IO传输。

2,Socket通讯的过程

  (1) 创建Socket;

  (2) 打开连接到Socket的输入/出流;

  (3) 按照一定的协议对Socket进行读/写操作;

  (4) 关闭Socket.


UDP:

1、面向无连接,不需要建立连接

2、将数据及源和目的封装成数据包,每个数据包的大小限制在64K内

3、不可靠,因为无连接,是不可靠协议

4、速度快,因为不用建立连接

UDP应用:

通常应用应用与聊天,视频会议,桌面共享等即使丢失数据也不妨碍进行的通信。

UDP示例:

<span style="font-size:18px;">/*
udp发送端:
*/

import java.net.*;
class UdpSend 
{
	public static void main(String[] args)throws Exception 
	{
		//1、通过DatagramSocket对象创建UDP服务。
		DatagramSocket datagramSocket=new DatagramSocket();

		//2、确定数据,并封装成数据包。
		byte[] buf="Hello World".getBytes();
		DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.152.1"),8888);

		//3、通过Socket服务,将已有的数据包发送出去。通过send方法。
		datagramSocket.send(dp);

		//4、关闭资源
		datagramSocket.close();
	}
}

/*
udp接收端
*/

class UdpReceive
{
	public static void main(String[] args)throws Exception
	{
				
			//1、创建udp Socket服务,建立端点
			DatagramSocket ds=new DatagramSocket(8888);

			//2、定义数据包。用于存储数据
			byte[] buf=new byte[1024];
			DatagramPacket dp=new DatagramPacket(buf,buf.length);

			//3、通过Socket服务的receive方法将接收到的数据存入数据包中
			ds.receive(dp);			//阻塞式方法,当没有数据可以接收时,程序会停止运行,等待数据。

			//4、通过数据包的方法获取其中的数据
			String ip=dp.getAddress().getHostName();
			String data=new String(dp.getData(),0,dp.getLength());
			int port=dp.getPort();
			System.out.println(ip+"::"+data+"::"+port);
			//5、关闭资源
			ds.close();
		}
		
	}
}
</span>
TCP:

1、面向连接,建立连接,形成传输数据的通道。

2、在连接中进行大数据量的传输

3、通过三次握手完成协议,是可靠协议 //第一次本方发送请求,第二次对方确认连接,第三次本方再次确认连接成功。

4、必须建立连接,效率稍低

<span style="font-size:18px;">import java.io.*;
import java.net.*;

/*客户端*/
public class ClientText {

	/*
		服务端读取客户端键盘录入的信息,并将其转成大写。
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub	
		Socket s = new Socket("192.168.152.1",10005);
		//读取键盘录入
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
		//将数据输出到服务端
		BufferedWriter bufout = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		//接收服务端发送过来的数据
		BufferedReader bufrin = new BufferedReader(new InputStreamReader(s.getInputStream()));
		
		String line = null;
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			bufout.write(line);
			bufout.newLine();
			bufout.flush();
			
			String str = bufrin.readLine();
			System.out.println("服务端说:"+str);
		}
		s.close();
		bufr.close();
	}

}
/*服务端*/
class ServerText
{
	public static void main(String[] args) throws Exception
	{
		//端口号必须和客户端指定的端口号一致
		ServerSocket ss = new ServerSocket(10005);
		//通过accept方法接收一个通信对象
		Socket s = ss.accept();
		//接收客户端的数据
		BufferedReader bufrin = new BufferedReader(new InputStreamReader(s.getInputStream()));
		//发送数据到客户端
		BufferedWriter bufout = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		
		String line = null;
		while((line=bufrin.readLine())!=null)
		{
			bufout.write(line.toUpperCase());
			bufout.newLine();
			bufout.flush();
		}
		s.close();
		ss.close();
	}
}
</span>

TCP上传图片:

<span style="font-size:18px;">/*
	客户端
*/

package cn.itcast.net.p1.uploadpic;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class UploadPicClient {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws UnknownHostException 
	 */
	public static void main(String[] args) throws UnknownHostException, IOException {

		
		//1,创建客户端socket。
		Socket s = new Socket("192.168.1.100",10006);
		
		//2,读取客户端要上传的图片文件。
		FileInputStream fis = new FileInputStream("c:\\0.bmp");
		
		//3,获取socket输出流,将读到图片数据发送给服务端。
		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 lenIn = in.read(buf);
		String text = new String(buf,0,lenIn);
		System.out.println(text);
		
		fis.close();
		s.close();
		
		
		
		
	}

}
</span>
<span style="font-size:18px;">/*
	服务端
*/

package cn.itcast.net.p1.uploadpic;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadPicServer {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
			
		//创建tcp的socket服务端。
		ServerSocket ss = new ServerSocket(10006);
		
		while(true){
			Socket s = ss.accept();			
			
			new Thread(new UploadTask(s)).start();		
			
		}
		//获取客户端。
		
		
//		ss.close();
		
		
	}

}
</span>

<span style="font-size:18px;">/*
	定义线程
*/

package cn.itcast.net.p1.uploadpic;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class UploadTask implements Runnable {

	private static final int SIZE = 1024*1024*2;
	private Socket s;

	public  UploadTask(Socket s) {
		this.s = s;
	}

	@Override
	public void run() {

		int count = 0;
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip + ".....connected");
		
		try{

		// 读取客户端发来的数据。
		InputStream in = s.getInputStream();

		// 将读取到数据存储到一个文件中。
		File dir = new File("c:\\pic");
		if (!dir.exists()) {
			dir.mkdirs();
		}
		File file = new File(dir, ip + ".jpg");
		//如果文件已经存在于服务端 
		while(file.exists()){
			file = new File(dir,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);
			
			if(file.length()>SIZE){
				System.out.println(ip+"文件体积过大");
				
				fos.close();
				s.close();
				
				
				System.out.println(ip+"...."+file.delete());
				
				return ;
			}
		}

		// 获取socket输出流,将上传成功字样发给客户端。
		OutputStream out = s.getOutputStream();
		out.write("上传成功".getBytes());

		fos.close();
		s.close();
		}catch(IOException e){
			
		}

	}

}
</span>



------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值