InetAddress 一个ip实例
import java.net.InetAddress;
class InetAddressTest
{
public static void main(String[] args) throws Exception
{
//根据主机名获取对应实例
InetAddress ip = InetAddress.getByName("www.baidu.com");
System.out.println(ip); //在给定主机名的情况下确定主机的IP地址 输出:www.baidu.com/220.181.111.148
System.out.println(ip.isReachable(2000)); //测试是否可以达到该地址 false
//根据ip地址获取InetAddress实例
InetAddress local = InetAddress.getByAddress(new byte[]{127,0,0,1});
System.out.println(local); //输出 /127.0.0.1
System.out.println(local.isReachable(2000));//true
System.out.println(local.getHostAddress()); // 返回 IP 地址字符串(以文本表现形式)输出:127.0.0.1
System.out.println(local.getHostName()); //获取此 IP 地址的主机名 输出: 127.0.0.1
}
}
URLEncoder URLDecoder
编码和解码
浏览器地址栏中文的“乱码”其实是application/x-www.-form-urlencoded MIME字符串
import java.net.URLDecoder;
import java.net.URLEncoder;
class URLTest
{
public static void main(String[] args) throws Exception
{
String url = URLEncoder.encode("网址","utf-8");
System.out.println(url); //%E7%BD%91%E5%9D%80
url = URLDecoder.decode("%E7%BD%91%E5%9D%80","utf-8");
System.out.println(url); //网址
}
}
最简单的UDP程序
发送端:
DatagramSocket :此类表示用来发送和接收数据报包的套接字
DatagramPacket: 此类表示数据报包
113.14.208.112是本机ip地址,我的电脑-网络-右键属性-宽带连接-详细信息 可以查看
import java.net.*;
class UdpSend
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds = new DatagramSocket();
String strInfo = "hello www.it315.org";
ds.send(new DatagramPacket("hello www.it315.org".getBytes(),
"hello www.it315.org".length(),
InetAddress.getByName("113.14.208.112"),
3000));
ds.close();
}
}
接收端: cmd中输入start打开一个新窗口,接收端先运行,发送端后运行
import java.net.*;
class UdpRecv
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds = new DatagramSocket(3000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,1024);
ds.receive(dp);
System.out.println("接受字符串:" + new String(dp.getData(),0,dp.getLength()));
System.out.println("发送方IP:" + dp.getAddress().getHostAddress());
System.out.println("发送方端口" + dp.getPort());
ds.close();
}
}
![](http://hi.csdn.net/attachment/201203/15/0_1331839856uyaQ.gif)
Tcp程序
创建tcp程序,accept()等待连接
1.运行服务器端程序
2.新开一个窗口,输入telnet 113.14.208.112 8001
此时连接服务器端,然后服务器端输出流welcome to ....... 在telnet窗口显示出来
3.输入任意字符,服务器端将会打印出来
import java.net.*; import java.io.*; class TcpServer { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(8001); //创建绑定到特定端口的服务器套接字 Socket s = ss.accept(); //侦听并接受到此套接字的连接 InputStream ips = s.getInputStream(); OutputStream ops = s.getOutputStream(); ops.write("welcome to www.it315.org".getBytes()); //byte[] buf = new byte[1024]; //int len = ips.read(buf); //一读到数据,马上读出来,输入abc,只输入到a程序就结束了 //System.out.println(new String(buf,0,len)); //字节流到字符流的转换 BufferedReader br = new BufferedReader(new InputStreamReader(ips)); System.out.println(br.readLine()); //一次读取一行 ips.close(); //注意关闭顺序 ops.close(); s.close(); ss.close(); } }
一个自己发送接收数据的例子
输入ip和数据,回车后发送,并显示在窗口上
import java.awt.*; import java.awt.event.*; import java.net.*; class Chat extends Frame { List list = new List(6); //6条信息 超过6条用滚动条显示 TextField tfIP = new TextField(15); //IP地址文本框 TextField tfData = new TextField(20); //输入文本框 DatagramSocket ds = null; public Chat(){ try{ ds = new DatagramSocket(3000); }catch(Exception e){ e.printStackTrace(); } /*界面*/ this.add(list,"Center"); Panel p = new Panel(); this.add(p, "South"); p.setLayout(new BorderLayout()); p.add(tfIP, "West"); p.add(tfData, "East"); /*接受数据 单独的线程*/ new Thread(new Runnable(){ public void run(){ byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,1024); while(true){ try{ ds.receive(dp); list.add(new String(buf,0,dp.getLength()) + " from " + dp.getAddress().getHostAddress() + ":" + dp.getPort(),0); }catch(Exception e){ if(!ds.isClosed()){ //关闭后才输出异常,否则在关闭窗口后ds.close()还没有关闭,这里会报异常 e.printStackTrace(); } } } } }).start(); /*发送数据*/ tfData.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ byte[] buf; buf = tfData.getText().getBytes(); try{ DatagramPacket dp = new DatagramPacket(buf,buf.length, InetAddress.getByName(tfIP.getText()),3000); ds.send(dp); }catch(Exception ex){ //在ActionEvent e已经有e的变量的 ex.printStackTrace(); } tfData.setText(""); } }); /*关闭窗口*/ addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ ds.close(); //关闭窗口前关闭ds dispose(); System.exit(0); } }); } public static void main(String[] args){ Chat chat = new Chat(); chat.setSize(300,400); //宽高 chat.setTitle("Chat"); //标题 chat.setVisible(true); //可见 chat.setResizable(false); //不可改变大小 } }
完善的TCP服务器程序模型
服务器程序能够与多个客户端会话,客户端向服务器发送一行文本
服务器将文本反序排列发送给客户端,发送"quti"时,服务器结束与客户端的会话
编写要点:
1.TCP服务器要想接受多个客户端的连接,需要循环调用ServerSocket accept方法
2.服务器成语与每个客户端的会话过程不能互相影响,需要在独立的线程中运行
3.一个线程服务对象与一个服务端Socket对象相关联,共同来完成与一个客户端的会话
使用运行:
1.首先cmd一个窗口,然后start多个窗口
2.运行服务端程序RerverServer
3.某一个新窗口中telnet 127.0.0.1 8001 ,之后输入abc,则服务端显示abc,然后返回给客户端一个反序文本
RerverServer 服务端
import java.net.*; class ReverseServer { public static void main(String[] args) { boolean bRunning = true; try{ ServerSocket ss = new ServerSocket(8001); while(bRunning){ Socket s = ss.accept(); new Thread(new Servicer(s)).start(); } ss.close(); }catch(Exception e){ e.printStackTrace(); } } }
import java.net.*; import java.io.*; class Servicer implements Runnable { private Socket s = null; public Servicer(Socket s){ this.s = s; } public void run(){ try{ InputStream ips = s.getInputStream(); OutputStream ops = s.getOutputStream(); BufferedReader br = new BufferedReader( new InputStreamReader(ips)); PrintWriter pw = new PrintWriter(ops,true); while(true){ String strLine = br.readLine(); if(strLine.equalsIgnoreCase("quit")){ break; } System.out.println(strLine); String strEcho = new StringBuffer(strLine).reverse().toString(); pw.println(strLine + "-->" + strEcho); } br.close(); pw.close(); s.close(); }catch(Exception e){ e.printStackTrace(); } } }