网络编程

来源:互联网 发布:淘宝卖家威胁我怎么办 编辑:程序博客网 时间:2024/06/05 18:08

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.148System.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.1System.out.println(local.isReachable(2000));//trueSystem.out.println(local.getHostAddress());  // 返回 IP 地址字符串(以文本表现形式)输出:127.0.0.1System.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%80url = 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(); //关闭窗口前关闭dsdispose();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();}}}







原创粉丝点击