-------------------- <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("上传成功");
}
}
类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>、期待与您交流! ----------------------