关于网络编程的总结



1、网络通讯三要素:

a) IP

b) 端口

c) 协议:TCP UDP

2、IP

a) InetAddress

b) 网络设备的标识,因不易记忆用主机名

c) 本地回环地址:127.0.0.1 主机名:Localhost

d) 代码示例:

package net;

import java.net.InetAddress;

public class IPDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception
	{
		InetAddress i=InetAddress.getLocalHost();
		//sop(i.toString());
		sop("address:"+i.getHostAddress());//获取主机地址
		sop(""+i.getHostName());//获取主机名
		InetAddress ia=InetAddress.getByName("www.baidu.com");
		sop("address:"+ia.getHostAddress());//获取百度地址
		sop("name:"+ia.getHostName());//获取百度地址

	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}

}


3、端口

a) 用于标识进程的逻辑地址,不同进程的标识。

b) 有效端口0-65535,其中0-1024是系统使用或保留端口

4、TCP

a) 建立连接,形成传输数据的通道

b) 在连接中进行大数据量传输

c) 通过三次握手完成连接,是可靠协议

d) 必须建立连接,效率会降低

5、UDP

a) 将数据及源和目的封装成数据包,不需要建立连接

b) 每个数据报的大小在限制在64K

c) 因无连接,是不可靠协议

d) 不需要建立连接,速度快。

6、Socket

Socket就是为网络提供的一种机制,通信的两端都是socket,网络通信其实就是socket通信,数据在两个socket之间通过IO传输。

7、UDP传输

a) 发送端思路:

i. 建立UDPSocket服务

ii. 提供数据,并将数据封装到数据包中

iii. 通过socket服务的发送功能,将数据包发送出去

iv. 关闭资源

b) 接收端思路

i. 定义UDPSocket服务,监听一个端口,定义数字标识

ii. 定义一个数据包,接收字节数据,因为数据包对象中有很多功能可以提取字节数据中的不同数据信息

iii. 通过socket服务的receive 方法将收到的数据存入已定义好的数据包中

iv. 通过数据包对象的特有功能,将这些不同的数据取出打印在控制台上。

v. 关闭资源

c) 发送端代码实现

package net;

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

public class UDPSend {

	/**
	 * @param args
	 */
	public static void main(String[] args)throws Exception
	{
		//1、创建UDP服务,通过DatagramSocket对象
		DatagramSocket ds=new DatagramSocket();
		//2、确定数据包并封装成数据包DatagramPacket(byte[] buf,int length,InetAddress address,int port)
		byte[] buf="哈哈哈哈,你好啊!".getBytes();
		DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.11.211"),1000);
		//3、通过socket服务,发送数据,用send方法
		ds.send(dp);
		//4、关闭资源
		ds.close();
	}

}


d) 接收端代码实现

package net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReceive {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception
	{
		//1、创建UDP socket,建立端点
		DatagramSocket ds=new DatagramSocket(1000);
		//2、定义数据包,用于存储数据
		byte [] buf=new byte[1024];
		DatagramPacket dp=new DatagramPacket(buf,buf.length);
		//3、通过服务的reveive方法将收到数据存入数据包中
		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();
	}

}


8、TCP传输

a) 客户端思路

建立对象时,就可以去连接指定的主机,因为TCP是面向连接的,所以在建立socket服务时就要有服务端存在,并连接成功,形成通过后,在该通道中数据传输

b) 服务端思路

i. 建立服务端的socket服务:ServerSocket()

ii. 获取链接过来的客户端对象,通过ServerSocketaccept方法,没有连接就会等,该方法称为阻塞式

iii. 客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流读取发过来的数据

iv. 关闭服务

c) 客户端代码实现

 

package net;

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

public class TCPClient {

	/**
	 * @param args
	 */
	public static void main(String[] args)throws Exception
	{
		//创建客户端的socket服务,指定目的主机和端口
		Socket s=new Socket("192.168.11.211",1005);
		//为了发送数据,应该获取socket流中的输出流
		OutputStream out=s.getOutputStream();
		out.write("TCP  is comming".getBytes());
		s.close();
	}

}

d) 服务端代码实现

 

package net;

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

public class TCPServer {

	/**
	 * @param args
	 */
	public static void main(String[] args)throws Exception
	{
		//建立服务端socket服务,并监听一个端口
		ServerSocket ss=new ServerSocket(1005);
		//通过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();
		

	}

}

9、实例一:聊天程序

代码示例:

 

package net;

import java.net.DatagramSocket;

public class ChatDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args)throws Exception
	{
		DatagramSocket sendSocket=new DatagramSocket(1003);
		DatagramSocket receSocket=new DatagramSocket(1002);
		new Thread(new Send(sendSocket)).start();
		new Thread(new Receive(receSocket)).start();

	}

}


package net;

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

public class Send implements Runnable {

	
	private DatagramSocket ds;
	public Send(DatagramSocket ds)
	{
		this.ds=ds;
	}
	public void run() {
		try{
			BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
			String line=null;
			while((line=bufr.readLine())!=null)
			{
				if("886".equals(line))break;
				byte[] buf=line.getBytes();
				DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.11.211"),1002);
				ds.send(dp);
				
			}
		}
		catch(Exception e)
		{
			throw new RuntimeException("发送失败");
		}

	}

}

package net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Receive implements Runnable {

	private DatagramSocket ds;
	public Receive(DatagramSocket ds)
	{
		this.ds=ds;
	}
	public void run() {
		while(true)
		{
			try{
			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());
			System.out.println(ip+"::"+data);
			}
			catch(Exception e)
			{
				throw new RuntimeException("接收失败");
			}
		
		}

	}

}


10、实例二:编写文本转换服务器

a) 需求:客户端给服务器发送文本,服务器会将文本转成大写返回给客户端,而且客户端不断地进行文本转换,当客户端输入over结束

b) 步骤

i. 建立服务

ii. 获取键盘录入

iii. 将数据发给服务端

iv. 服务端返回大写数据

v. 关闭资源

c) 代码示例:

 

package net;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class TransClient {
	public static void main(String [] args)throws IOException
	{
		Socket s=new Socket("192.168.11.211",1007);
		//定义读取键盘数据的流对象
		BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
		//定义目的,将数据写入到Socket输出流,发给服务器
		BufferedWriter bufout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		//定义一个Socket读取流,读取服务端返回的大写信息
		BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
		
		String line=null;
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			bufout.newLine();
			bufout.flush();
			String str=bufIn.readLine();
			System.out.println("server:"+str);
			
		}
		
		bufr.close();
		s.close();
		
		
	}
	
}

 

package net;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TransServer {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception
	{
		ServerSocket ss=new ServerSocket(1007);
		Socket s=ss.accept();
		String ip=s.getInetAddress().getHostAddress();
		System.out.println("ip"+ip);
		//读取Socket读取流中的数据
		BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
		//目的,Socket输出流,将大写数据写入到Socket输出流,并发给客户端
		BufferedWriter bufout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		String line=null;
		while((line=bufIn.readLine())!=null)
		{
			bufout.write(line.toUpperCase());
			bufout.newLine();
			bufout.flush();
		}
		s.close();
		ss.close();
		
	}

}

11、实例三:TCP复制文件

代码示例:

 

package net;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class TextClient {

	/**
	 * @param args
	 */
	public static void main(String[] args)throws Exception
	{
		Socket s=new Socket("192.168.11.211",1009);
		BufferedReader bufr=new BufferedReader(new FileReader("file\\Stream.txt"));
		PrintWriter out=new PrintWriter(s.getOutputStream(),true);
		String line=null;
		while((line=bufr.readLine())!=null)
		{
			out.println(line);
			
		}
		s.shutdownOutput();
		BufferedReader bufIn =new BufferedReader(new InputStreamReader(s.getInputStream()));
		String str=bufIn.readLine();
		System.out.println(str);
		bufr.close();
		s.close();
		

	}

}

package net;

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TextServer {

	/**
	 * @param args
	 */
	public static void main(String[] args)throws Exception
	{
	
		ServerSocket ss=new ServerSocket(1009);
		Socket s=ss.accept();
		BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
		PrintWriter out=new PrintWriter(new FileWriter("music\\server.txt"),true);
		String line=null;
		while((line=bufIn.readLine())!=null)
		{
			out.println(line);
					
			
		}
		PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
		pw.println("上传成功");
		s.close();
		ss.close();

	}

}


12、实例四:上传图片

代码示例:

 

package net;

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

public class PicClient {

	/**
	 * @param args
	 */
	public static void main(String[] args)throws Exception
	{
		
		
		if(args.length!=1)
		{
			sop("请选择一个jpg格式图片");
			return ;
		}
		
		File file=new File("file\\question.gif");
		if(!(file.exists()&&file.isFile()))
		{
			sop("该文件不存在或者不是文件");
			return ;
		}
		if(!file.getName().endsWith(".gif"))
		{
			sop("格式错误");
			return ;
		}
		if(file.length()>1024*1024*5)
		{
			sop("文件过大");
			return ;
		}
		
		Socket s=new Socket("192.168.11.211",10003);
		
		FileInputStream fis=new FileInputStream("file\\question.gif");
		//PrintWriter out=new PrintWriter(new FileWriter("file\\question.gif"));
		OutputStream out=(OutputStream) 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();
			
			
	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}

}

package net;

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


public class PicServer {

	/**
	 * @param args
	 */
	public static void main(String[] args)throws Exception
	{
		ServerSocket ss=new ServerSocket(10001);
		Socket s=ss.accept();
		InputStream in=s.getInputStream();
		FileOutputStream fos=new FileOutputStream("picture\\server.jpg");
		byte[] buf=new byte[1024];
		int len=0;
		while((len=in.read(buf))!=-1)
		{
			fos.write(buf,0,len);
		}
		OutputStream out=(OutputStream) s.getOutputStream();
		out.write("上传成功".getBytes());
		fos.close();
		ss.close();
		s.close();
		

	}

}


13、实例五:用户校验

代码示例:

 

package net;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class LoginClient {

	/**
	 * @param args
	 */
	public static void main(String[] args)throws Exception
	{
		Socket s=new Socket("192.168.11.211",10101);
		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=0;x<3;x++)
		{
			String line=bufr.readLine();
			if(line==null)
				break;
			out.println(line);
			String info=bufIn.readLine();
			System.out.println("infor:"+info);
			if(info.contains("欢迎")) break;
		}
		bufr.close();
		s.close();
	}

}

package net;

import java.net.ServerSocket;
import java.net.Socket;

public class LoginServer {

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

	}

}



package net;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class UserThread implements Runnable
{
	private Socket s;
	public UserThread(Socket s) {
		this.s=s;
	}
	public void run()
	{
		String ip=s.getInetAddress().getHostAddress();
		System.out.println(ip+"connected");
		try{
			for(int x=0;x<3;x++)
			{
				BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
				String name=bufIn.readLine();
				BufferedReader bufr=new BufferedReader(new FileReader("file\\user.txt"));
				PrintWriter out=new PrintWriter(s.getOutputStream(),true);
				String line=null;
				boolean flag=false;
				while((line=bufr.readLine())!=null)
				{
					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+"用户名不存在");
				}
				s.close();
			}
		}
		catch(Exception e)
		{
			throw new RuntimeException(ip+"接受失败!");
		}
	}

}



14、URL

 

 

package net;

import java.net.MalformedURLException;
import java.net.URL;

public class URLDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws MalformedURLException
	{
	
		//URL url=new URL("http://baidu.com?name=haha&age=33");
		URL url=new URL("http://www.baidu.com");
		sop("协议:"+url.getProtocol());//打印协议名词
		sop("主机名:"+url.getHost());//打印主机名
		sop("端口:"+url.getPort());//打印端口名
		sop("路径:"+url.getPath());//打印路径
		sop("文件名:"+url.getFile());//打印文件名
		sop("查询部分"+url.getQuery());//查询部分
		
	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}

}

package net;

import java.net.*;

public class URLConnection {

	/**
	 * @param args
	 */
	public static void main(String[] args)throws Exception
	{
		URL url=new URL("http://www.baidu.com");
		java.net.URLConnection conn=url.openConnection();
		sop(conn);
		
		
	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}

}


 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值