黑马程序员------Java基础-----网络编程

黑马程序员——Java基础—–网络编程

——- android培训java培训、期待与您交流! ———-

1、IP地址

在互联网上每一台计算机都有唯一的表示自己的标记,这个标记就是IP地址,IP地址是使用32位长度的二进制数据表示如:192.168.1.103。

2.TCP协议和UDP协议的区别

TCP协议面向连接的,而UDP协议时面向非连接的。TCP协议时可靠的传输协议,在传输数据时不会丢失数据。而UDP协议时不可靠的传输协议,在传输数据的过程中容易丢失数据。所以TCP协议传输数据的速度没有UDP协议的速度快

3、InetAddress类

intentAddress类主要是表示Ip地址的中有以下的常用方法:

getByName():通过主机名得到InetAddress对象

getLocalHost():通过本机得到InetAddress对象

getHostName():得到IP地址

isReachable():判断地址是否可以到达,同时指定超时时间

4、TCP程序设计

在java中使用Socket来完成TCP程序开发,使用此类可以方便地建立可靠的,双向的、持续的、点对点的通信连接。

在服务器端用到是ServerSocket类,用于接受客户端地请求。在服务器端每次运行时都要使用accept()方法等待客户端的连接,此方法执行之后服务器端将进入阻塞状态,直到客户端连接之后程序才能继续向下执行。

在客户端,程序可以通过Socket类地getInputStream()方法取得服务器的输出信息,在服务器端可以通过getOutputStream()方法取得客户端地输出信息。
示例:

/* 
需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。 
*/  
//客户端  
import java.net.*;  
import java.io.*;  
class  TcpClient  
{  
    public static void main(String[] args) throws Exception  
    {  
        //1、创建客户端的Socket服务。指定目的主机和端口  
        Socket s=new Socket("127.0.0.1",10000);  
        //2、获取Socket流中输出流,发送数据  
        OutputStream out=s.getOutputStream();  
        out.write("你好!".getBytes());  
        //3、获取Socket流中的输入流,用来接收服务端的反馈信息并打印  
        InputStream in=s.getInputStream();  

        byte[] buf=new byte[1024];  
        int len=in.read(buf);//读取反馈的数据  

        //输出接收的数据  
        System.out.println(new String(buf,0,len));  

        s.close();//关闭资源  
    }  
}  


//服务端  

class TcpServer  
{  
    public static void main(String[] args)throws Exception  
    {  
        //1、创建服务端的Socket服务,并监听一个端口  
        ServerSocket ss=new ServerSocket(10000);  
        //2、通过accept方法获取连接过来的客户端对象。  
        Socket s=ss.accept();  
        //获取客户端ip  
        String ip=s.getInetAddress().getHostName();  
        System.out.println(ip+"connected....");  
        //3、获取对应客户端对象的读取流读取发过来的数据,并打印  
        InputStream in=s.getInputStream();  
        byte[] buf=new byte[1024];  
        int len=in.read(buf);  
        System.out.println(new String(buf,0,len));  

        //4、调用对应的客户端的输出流写入返回数据  
        OutputStream out=s.getOutputStream();  
        out.write("哥们,收到!".getBytes());  

        //关闭资源  
        s.close();  
        ss.close();//可选操作  
    }  
}    

5、UDP程序设计

使用UDP发送数据的数据,对方不一定能接收到。所有的信息使用数据报的形式发送出去,所以这就要求客服端要始终保持着等待接受服务器端发过来的数据,在Java中使用DatagramSocket类和DatargramPacket类来完成程序的开发。

DatagramSocket类来完数据发生的操作,DatagramPacket类来完成数据的包装。

/* 
udp发送端: 
需求:通过udp传输方式,将一段文字数据发送出去。 
*/  

import java.net.*;  
class UdpSend   
{  
    public static void main(String[] args)throws Exception   
    {  
        //1、创建udp服务。通过DatagramSocket对象  
        DatagramSocket ds=new DatagramSocket();  
        //2、确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)   
        byte[] buf="udp shi shen ma".getBytes();  
        DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.175"),10000);  

        //3、通过Socket服务,将已有的数据包发送出去。通过send方法。  
        ds.send(dp);  
        //4、关闭资源  
        ds.close();  
    }  
}  

/* 
udp接收端 
需求:定义一个应用程序,用于接收udp协议传输的数据并处理。 
*/  

class UdpReceive  
{  
    public static void main(String[] args)throws Exception  
    {  
        //1、创建udp Socket服务,建立端点  
        //DatagramSocket ds=new DatagramSocket(10000);  

        //一直处于接收状态  
        while(true)  
        {  
            //1、创建udp Socket服务,建立端点  
            DatagramSocket ds=new DatagramSocket(10000);  
            //2、定义数据包。用于存储数据  
            byte[] buf=new byte[1024];  
            DatagramPacket dp=new DatagramPacket(buf,buf.length);  
            //3、通过Socket服务的receive方法将接收到的数据存入数据包中  
            ds.receive(dp);//阻塞式方法  
            //4、通过数据包的方法获取其中的数据  
            String ip=dp.getAddress().getHostName();  
            String data=new String(dp.getData(),0,dp.getLength());  
            int port=dp.getPort();  
            System.out.println(ip+"::"+data+"::"+port);  
            //5、关闭资源  
            ds.close();  
        }  
        //5、关闭资源  
        //ds.close();  
    }  
}  

下面是学习过程中,做过的几个小练习:
练习一:

/* 
需求:并发上传图片 
*/  

import java.io.*;  
import java.net.*;  
//客户端  
class  PicClient  
{  
    public static void main(String[] args) throws Exception  
    {  
        //对传入的值进行判断  
        if (args.length!=1)  
        {  
            System.out.println("请指定一个图片文件!");  
            return;  
        }  

        File file=new File(args[0]);  

        //对文件路径进行判断  
        if (!(file.exists()&&file.isFile()))  
        {  
            System.out.println("你上传的文件有问题,非文件或者不存在!");  
            return;  
        }  

        //判断是否是图片文件  
        if (!file.getName().endsWith(".jpg"))  
        {  
            System.out.println("图片格式错误,请重新选择!");  
            return;  
        }  

        //对文件大小进行判断  
        if (file.length()>1024*1024*5)  
        {  
            System.out.println("你上传的文件过大,居心叵测!");  
            return;  
        }  

        //创建服务  
        Socket s=new Socket("localhost",10000);  
        //读取图片数据  
        FileInputStream fis=new FileInputStream(file);  

        //用Socket服务输出流写入数据  
        OutputStream out =s.getOutputStream();  

        BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));  

        byte[] buf=new byte[1024];  

        int len=0;  

        while ((len=fis.read(buf))!=-1)  
        {  
            out.write(buf,0,len);  
        }  

        //结束标记,表示文件数据已经上传完了  
        s.shutdownOutput();  

        String info=in.readLine();//读取返回信息  
        System.out.println(info);  

        fis.close();//关流  
        s.close();  

    }  
}  

//服务端  
class PicServer  
{  
    public static void main(String[] args)throws Exception  
    {  
        //创建服务,监听端口  
        ServerSocket ss=new ServerSocket(10000);  

        while (true)  
        {  
            //获取客户端对象  
            Socket s=ss.accept();  
            //客户端执行线程  
            new Thread(new PicThread(s)).start();  
        }  

        //ss.close();  
    }  
}  

//利用多线程实现并发上传  
class PicThread implements Runnable  
{  
    private Socket s;  
    PicThread(Socket s)  
    {  
        this.s=s;  
    }  
    public void run()  
    {  
        int count=1;  
        //获取客户端ip  
        String ip=s.getInetAddress().getHostAddress();  
        try  
        {         
            System.out.println(ip+"  connected.....");  

            //通过客户端的读取流读取数据  
            InputStream in=s.getInputStream();  
            //文件保存路径  
            File dir =new File("C:\\Users\\asus\\Desktop");  
            //文件名  
            File file=new File(dir,ip+".jpg");  
            //判断文件是否存在  
            while(file.exists())  
            {  
                file=new File(dir,ip+"("+(count++)+").jpg");  
            }  

            //将数据写入到指定文件中  
            FileOutputStream fos=new FileOutputStream(file);  

            byte[] buf=new byte[1024];  
            int len=0;  
            while ((len=in.read(buf))!=-1)  
            {  
                fos.write(buf,0,len);  
            }  

            //将收到图片数据的信息返回给客户端  
            OutputStream out=s.getOutputStream();  

            out.write("上传成功!".getBytes());  

            fos.close();//关流  
            s.close();  
        }  
        catch (Exception e)  
        {  
            throw new RuntimeException(ip+"图片上传失败");  
        }  
    }  
}  

练习二:

import java.io.*;  
import java.net.*;  
//客户端  
class  LoginClient  
{  
    public static void main(String[] args) throws Exception  
    {  
        //创建服务  
        Socket s=new Socket("localhost",10000);  
        //键盘录入  
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));  
  
          
        //用Socket服务输出流写入数据  
        PrintWriter out =new PrintWriter(s.getOutputStream(),true );  
  
        //接收服务器返回的信息  
        BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));  
  
        String line=null;  
  
        for(int x=0;x<3;x++)  
        {  
            line=br.readLine();//读取键盘录入  
            if (line==null)  
            {  
                break;//如果键盘没有输入,则直接结束  
            }  
  
            out.println(line);//将数据写入流中  
  
            String info=in.readLine();//读取返回信息  
  
            System.out.println(info);  
  
            if (info.contains("欢迎"))//---------------  
            {  
                break;//如果登录成功,就跳出循环  
            }  
        }  
  
        br.close();//关流  
        s.close();  
    }  
}  
  
//服务端  
class LoginServer  
{  
    public static void main(String [] args)throws Exception  
    {  
        //创建服务,监听端口  
        ServerSocket ss=new ServerSocket(10000);  
          
        while (true)  
        {  
            //获取客户端对象  
            Socket s=ss.accept();  
          
            //客户端执行线程  
            new Thread(new LoginThread(s)).start();  
        }  
          
        //ss.close();  
    }  
}  
  
//利用多线程实现并发登录  
class LoginThread implements Runnable  
{  
    private Socket s;  
    LoginThread(Socket s)  
    {  
        this.s=s;  
    }  
    public void run()  
    {  
        //获取客户端ip  
        String ip=s.getInetAddress().getHostAddress();  
        System.out.println(ip+"  connected.....");  
        try  
        {         
            for (int x=0;x<3 ;x++ )  
            {     
                //通过客户端的读取流读取数据  
                BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));  
                  
                //读取数据库中的数据,这里用文件来表示数据库  
                BufferedReader br=new BufferedReader(new FileReader("users.txt"));  
  
                String line=in.readLine();//读取客户端数据  
                if (line==null)//--------------  
                {  
                    break;//如果客户端没有发送数据,则跳出循环  
                }  
                String data=null;  
                boolean flag=false;//设置标记  
                //读取数据库中的用户数据  
                while ((data=br.readLine())!=null)  
                {  
                    if (line.equals(data))  
                    {  
                        flag=true;//如果用户存在,则将标记设为true  
                        break;  
                    }  
                }  
  
                //将数据写入到指定文件中  
                PrintWriter out=new PrintWriter(s.getOutputStream(),true);  
  
                if (flag)  
                {  
                    System.out.println(line+",已登陆!");  
                      
                    out.println(line+",欢迎光临!");  
  
                    break;//-----------  
                }  
                else  
                {  
                    System.out.println(line+",尝试登陆!");  
                    out.println(line+",用户名不存在!");  
                }     
            }  
            s.close();//关流  
        }  
        catch (Exception e)  
        {  
            throw new RuntimeException("用户登陆失败");  
        }     
    }  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值