网络编程Socket

网络基础知识

 

IP:标识每台计算机

端口:标识一台计算机上的每个应用程序  端口范围:0~65535  ,一般编程使用1023以上的 端口号;0~1023的端口被系统所保留

协议:计算机之间的语言

 

InetAdress

此类表示互联网协议 (IP) 地址。

此类无构造函数,只能通过静态方法构造实例

import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAdressDemo {
   public static void main(String[] args) {
    try {
        InetAddress as=InetAddress.getLocalHost();
    System.out.println(as.getHostAddress());    //输出本机地址
    System.out.println(as.getHostName());  //输出本机名
    
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

 

URL

URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

 

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 import java.net.MalformedURLException;
 5 import java.net.URL;
 6 
 7 public class URLDemo {
 8   public static void main(String[] args) {
 9         try {
10             URL url = new URL("http://www.baidu.com");
11             java.io.InputStream is =url.openStream();
12                 
13                 InputStreamReader inz=new InputStreamReader(is,"utf-8");
14                 BufferedReader inzi=new BufferedReader(inz);
15                 String data=inzi.readLine();
16                   while(data!=null){
17                   System.out.print(data); 
18                  data=inzi.readLine();
19         }        
20                   inzi.close();
21                     is.close();
22                     inz.close();
23                     }catch (MalformedURLException e) {
24             e.printStackTrace();
25         } catch (IOException e) {
26             // TODO Auto-generated catch block
27             e.printStackTrace();
28         }
29 }
30 }

 

 

通过Socket实现TCP编程

主要用到两个类:ServerSocket     Socket

 

package tx;
/*
 * 多用户登录服务器端
 * */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class fuwuduan {
        public static void main(String[] args) {
            try {
                //定义服务器端口
                ServerSocket fwq=new ServerSocket(8888);
                
                while(true){
                    System.out.println("***********服务器等在客户端的连接********");
                    Socket     ss = fwq.accept();//阻塞等待客户端连接
                    //启动线程
                    xc cc=new xc(ss);
                Thread aa=new Thread(cc);    
                aa.setPriority(4);//设置线程优先级,提高程序效率,默认值为5;范围0~10
                aa.start();
                try {
                    aa.join();
                } catch (InterruptedException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                 // fwq.close();
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
               
            
               
            } catch (IOException e) {
                
                e.printStackTrace();
            }
        }
}

线程:

package tx;
/*
 * 线程,实现多客户连接
 * 
 * */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class xc implements Runnable {
    Socket ss;
    public xc(Socket ss) {
        super();
        this.ss = ss;
    }
    public void run() {
        try {
            
            System.out.println("服务器连接成功----^-^");
            //服务器接收客户端发来的信息
            java.io.InputStream inputstream=ss.getInputStream();
             InputStreamReader inputStreamreader=new InputStreamReader(inputstream);
             BufferedReader  bf=new BufferedReader( inputStreamreader);
           String sd=null;
           
           while((sd=bf.readLine()) != null){
             System.out.println("客户端发来了:"+sd); 
           }
         
           //服务器向客户端发送信息
           java.io.OutputStream in=ss.getOutputStream();
            OutputStreamWriter ou=new OutputStreamWriter(in);
            PrintWriter pt=new PrintWriter(ou);
            pt.write("我已收到你发来的信息!");
            pt.flush();
              
            //关闭资源
           ss.shutdownInput();
           ss.shutdownOutput();
           inputstream.close();
           inputStreamreader.close();
            pt.close();
            ou.close();
            in.close();
            bf.close();
            ss.close();
          
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

客户端:

package tx;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class khd {
       public static void main(String[] args) {
        try {
            
            Socket socket=new Socket("127.0.0.1",8888);//127.0.0.1表示本地主机地址;等同于"localhost"
            
            //客户端向服务器发送信息
            java.io.OutputStream in=socket.getOutputStream();
            OutputStreamWriter ou=new OutputStreamWriter(in);
            PrintWriter pt=new PrintWriter(ou);
            pt.write("用户名:admin2,密码:12345");
            pt.flush();
            socket.shutdownOutput();
            
            //客户端接收服务器发来的消息
            java.io.InputStream inputstream=socket.getInputStream();
             InputStreamReader inputStreamreader=new InputStreamReader(inputstream);
             BufferedReader  bf=new BufferedReader( inputStreamreader);
             String sd=null;
           
           while((sd=bf.readLine()) != null){
             System.out.println("服务器发来了---------》"+sd); 

           }
            
            
            
            socket.shutdownInput();
               inputstream.close();
               inputStreamreader.close();
                pt.close();
            pt.close();
            ou.close();
            in.close();
            socket.close();
            
            
            
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

基于Socket的DUP编程

主要用到的两个类:

Datagrampacket:

此类表示数据报包。

数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。  

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

实例应用:

用户登录案例:

服务器端:

package DUPDemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class fuwuqi {
       public static void main(String[] args) throws IOException {
        DatagramSocket  socket =new DatagramSocket(8800);
        byte[] buf=new byte[1024];
          
        DatagramPacket packet=new DatagramPacket(buf, buf.length);
        System.out.println("****服务器正在等待客户端连接*******");
        socket.receive(packet);
         System.out.println("****客户端连接成功");
         String string=new String(buf);
         System.out.println("客户端发来的信息:"+string);
         socket.close();
    }
}

客户端:

package DUPDemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class khd {
           public static void main(String[] args) throws IOException {
            byte[] buf="用户名:admin,密码:123".getBytes();
            InetAddress address=InetAddress.getByName("localhost");
            int port=8800;
               DatagramPacket packet=new DatagramPacket(buf, buf.length ,address,  port);
             DatagramSocket socket=new DatagramSocket();
             
               socket.send(packet);
               socket.close();
        }
}

在实际应用中,一般传输内容为对象,将用户名和密码封装在User类中传输。

posted on 2016-06-24 13:30  lgshiwoo  阅读(159)  评论(0编辑  收藏  举报