黑马程序员--网络编程


-------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


InetAddress:此类用来表示互联网协议 (IP) 地址。InetAddress类没有构造函数,所以不能够创建InetAddress对象。


InetAddress类的几个常用方法:

(1)getLocalHost()返回本地主机。

(2)getHostName()获取此IP地址的主机名。

(3)getHostAddress()返回 IP 地址字符串(以文本表现形式)。

(4)getByName()在给定主机名的情况下确定主机的 IP 地址。

(5)getByAddress()根据提供的主机名和 IP 地址创建 InetAddress。


例子:获取IP地址和给定IP地址的主机名。

import java.net.*;
class IpDemo 
{
	public static void main(String[] args) throws UnknownHostException
	{
		/*
		//获取本地主机
		InetAddress ia = InetAddress.getLocalHost();
		System.out.println(ia.toString());
		System.out.println("address:"+ia.getHostAddress());
		System.out.println("name:"+ia.getHostName());
		*/
		//获取给定主机名的IP地址
		InetAddress i = InetAddress.getByName("www.baidu.com");
		System.out.println("address:"+i.getHostAddress());
		System.out.println("name:"+i.getHostName());
		
	}
}

TCP 特点:

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

(2)每个数据报大小限制在64k内。

(3)传输不可靠。

(4)传输速度快。


UDP特点:

(1)建立连接,形成数据通道

(2)在连接中进行大数据传输。

(3)通过三次握手,传输可靠。

(4)传输效率低。


TCP传输:

(1)TCP分为客户端和服务端。

(2)客户端对应的对象是Socket,服务端对应的对象是ServerSocket。

因为TCP是面向连接的,所以在建立Socket服务时,就要有服务端存在,并连接成功后,形成通路,在通道进行数据的传输。


Socket:就是为网络服务提供的一种机制。此类实现客户端套接字,套接字是两台机器间通信的端点。使用Socket类时需要制定待连接的服务端的IP和端口号。服务器套接字与客户端套接字连接成功后,则可以获取套接字的输入输出流,进行数据交换。

ServerSocket:此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。


Socket常用的方法:

(1)构造方法:Socket(InetAddress address,int  port)创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

(2)getInetAddress()返回套接字连接的地址。

(3)getInputStream()返回此套接字的输入流。

(4)getOutputStream()返回此套接字的输出流。


ServerSocket常用的方法:

(1)构造方法:ServerSocket(int  port)创建绑定到特定端口的服务器套接字。

(2)accept()侦听并接受到此套接字的连接。


例子:

import java.io.*;
import java.net.*;
class TcpClient 
{
	public static void main(String[] args) throws Exception
	{
		Socket s= new Socket("169.254.246.240",10005);
		//为了发送数据,应该获取socket服务的输出流
		OutputStream out = s.getOutputStream();

		out.write("client is coming".getBytes());
		s.close();

	}
}

class TcpServer
{
	public static void main(String[] args)throws Exception
	{
		//建立服务端socket服务,并监听一个端口
		ServerSocket ss = new ServerSocket(10005);
		//通过accept方法获取连接过来的客户端对象
		Socket s = ss.accept();

		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+"::connect");
		//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据
		InputStream in = s.getInputStream();
		byte[] buf = new byte[1024];

		int len = in.read(buf);
		System.out.println(new String(buf,0,len));

		s.close();//关闭客户端
	}

}

例子:TCP复制文件

import java.io.*;
import java.net.*;
class TextClient 
{
	public static void main(String[] args) throws Exception
	{
		Socket s = new Socket("169.254.246.240",10008);

		BufferedReader bufr =
			new BufferedReader(new FileReader("IpDemo.java"));
		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();
	}
}


class TextServer 
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket ss =new ServerSocket(10008);
		Socket s = ss.accept();
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+"::is connected");

		BufferedReader bufIn =
			new BufferedReader(new InputStreamReader(s.getInputStream()));

		PrintWriter out = 
			new PrintWriter(new FileWriter("server.txt"),true);

		String line = null;
		while((line = bufIn.readLine())!=null)
		{
			out.println(line);
		}

		PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
		pw.println("上传成功");
	}
}


类DatagramPacket:此类表示数据报包。数据报包用来实现无连接包投递服务。

类DatagramSocket:此类表示用来发送和接收数据报包的套接字。


DatagramPacket的常用方法:

(1)构造函数:DatagramPacket(byte[] buf, int length,InetAddress address,int  port) 构造数据报包,用来将长度

为length 的包发送到指定主机上的指定端口号。

(2)getData()返回数据缓冲区。

(3)getLength()返回将要发送或接收到的数据的长度。

(4)getPort()返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。


DatagramSocket的常用方法:

(1)构造函数:DatagramSocket()构造数据报套接字并将其绑定到本地主机上任何可用的端口。

(2)send(DatagramPacket  p)从此套接字发送数据报包。

(3)receive(DatagramPacket  p)从此套接字接收数据报包。


例子:通过udp传输方式,将一段文字数据发送出去,接收端用于接收udp协议传输的数据并处理。

import java.net.*;
class UdpSend
{
	public static void main(String[] args) throws Exception
	{
		//创建UDP服务,通过DatagramSocket对象
		DatagramSocket ds = new DatagramSocket();
		//确定数据,并将数据封装成数据包
		byte[] buf = "udp send message".getBytes();
		DatagramPacket dp =
			new DatagramPacket(buf,buf.length,InetAddress.getByName("169.254.246.240"),10000);
		//通过socket服务,将已有数据发送出去。通过send方法
		ds.send(dp);
		ds.close();
	}
}

class UdpRece
{
	public static void main(String[] args)throws Exception
	{
		//创建UDP Socket,建立端点。
		DatagramSocket ds = new DatagramSocket(10000);
		//定义数据包,用于存储数据
		byte[] buf = new byte[1024];
		DatagramPacket ap = new DatagramPacket(buf,buf.length);
		//通过服务的receive方法,将接收到的数据存入已定义好的数据包中。
		ds.receive(ap);
		//通过数据包的方法获取其中的数据
		String ip = ap.getAddress().getHostAddress();
		String data = new String(ap.getData(),0,ap.getLength());

		int port = ap.getPort();

		System.out.println(ip+"::"+data+"::"+port);
		ds.close();
	}
}


例子:聊天程序

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

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)
			{
				byte[] buf = line.getBytes();
				if("886".equals(line))
					break;
				DatagramPacket dp =
					new DatagramPacket(buf,buf.length,InetAddress.getByName("169.254.246.255"),10003);
				ds.send(dp);
			}

		}
		catch (Exception e)
		{
			throw new RuntimeException("发送信息失败");
		}
	}
}


class Receive implements Runnable
{
	private DatagramSocket ds;
	public Receive(DatagramSocket ds)
	{
		this.ds = ds;
	}

	public void run()
	{
		try
		{
			while(true)
			{
				byte[] buf = new byte[1024];
				DatagramPacket dp = new DatagramPacket(buf,buf.length);
				ds.receive(dp);	

				String pi = dp.getAddress().getHostAddress();
				String data = new String(dp.getData(),0,dp.getLength());
				System.out.println(pi+":"+data);
			}
		}
		catch (Exception e)
		{
			throw new RuntimeException("接收信息失败");
		}
	}
}


class  ChartDemo
{
	public static void main(String[] args) throws Exception
	{
		DatagramSocket sendSocket = new DatagramSocket();
		DatagramSocket receiveSocket = new DatagramSocket(10003);

		new Thread(new Send(sendSocket)).start();
		new Thread(new Receive(receiveSocket)).start();

	}
}

例子:客户端通过键盘录入用户名, 服务端对这个用户名进行校
要求:
如果该用户存在,在服务端显示xxx,已登录。并在客户端显示:xxx,欢迎登陆。
如果该用户不存在,在服务端显示xxx,尝试登陆。并在客户端显示:xxx,该用户不存在。
最多登陆三次。

import java.io.*;
import java.net.*;
class  LoginClient
{
	public static void main(String[] args) throws Exception
	{
		Socket s = new Socket("169.254.246.240",10010);
		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();
			out.println(line);

			String info = bufIn.readLine();
			System.out.println("info::"+info);
			if(info.contains("欢迎"))
				break;
		}


		bufr.close();
		s.close();

	}
}


class  LoginServer
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket ss = new ServerSocket(10010);
		while(true)
		{
			Socket s = ss.accept();
			new Thread(new UserThread(s)).start();
		}
	}
}

class UserThread implements Runnable
{
	private Socket s;
	UserThread(Socket s)
	{
		this.s = s;
	}

	public void run()
	{
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+"::is connected");

		try
		{
			for(int x=0;x<3;x++)
			{
				BufferedReader bufIn =
					new BufferedReader(new InputStreamReader(s.getInputStream()));
				String name = bufIn.readLine();
				if(name==null)
					break;

				BufferedReader bufr = 
					new BufferedReader(new FileReader("usr.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 ex)
		{
			throw new RuntimeException("校验失败");
		}
	}
}

例子:自定义浏览器-Tomcat服务端

import java.io.*;
import java.net.*;
class MyIE 
{
	public static void main(String[] args) throws Exception
	{
		Socket s =new Socket("169.254.246.240",8080);

		PrintWriter out = new PrintWriter(s.getOutputStream(),true);

		out.println("GET /myweb/demo.html HTTP/1.1");
		out.println("Accept: */*");
		out.println("Accept-Language: zh-CN");
		out.println("Host: 169.254.246.240:10012");
		out.println("Connection: closed");

		out.println();
		out.println();

		BufferedReader bufr = 
			new BufferedReader(new InputStreamReader(s.getInputStream()));
		String line = null;

		while((line=bufr.readLine())!=null)
		{
			System.out.println(line);
		}

		s.close();
	
	}
}


---------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值