网络编程

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();
	}
}


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();
		}
	}
}







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值