网络编程

来源:互联网 发布:刷论坛推广软件 编辑:程序博客网 时间:2024/06/06 05:35

网络编程

 网络通讯三要素

IP地址(InetAddress),端口,传输协议(TCP、UDP)


IP地址(InetAddress)

class  IPDemo{public static void main(String[] args) throws Exception{InetAddress i = InetAddress.getLocalHost();   //获取本机IP地址i.getHostAddress();   //获取IP地址i.getHostName();      //获取主机名InetAddress ia = InetAddress.getByName("192.168.0.2");  //根据主机名获取InetAddress对象}}

传输协议(TCP、UDP)

两者的区别:


UDP
• 将数据及源和目的封装成数据包中,不需要建立连接
• 每个数据报的大小在限制在64k内
• 因无连接,是不可靠协议
• 不需要建立连接,速度快

TCP
• 建立连接,形成传输数据的通道。
• 在连接中进行大数据量传输
• 通过三次握手完成连接,是可靠协议
• 必须建立连接,效率会稍低


用UDP做聊天室程序

import java.io.*;import java.net.*;class Send implements Runnable{private DatagramSocket ds;public Send(DatagramSocket ds){this.ds = ds;}public void run(){try{BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));String line = null;while((line=bufr.readLine())!=null){byte[] buf = line.getBytes();DatagramPacket dp =             new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10002);ds.send(dp);if("886".equals(line))break;}}catch (Exception e){throw new RuntimeException("发送端失败");}}}class Rece implements Runnable{private DatagramSocket ds;public Rece(DatagramSocket ds){this.ds = ds;}public void run(){try{while(true){byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);ds.receive(dp);String ip = dp.getAddress().getHostAddress();String data = new String(dp.getData(),0,dp.getLength());if("886".equals(data)){System.out.println(ip+"....离开聊天室");break;}System.out.println(ip+":"+data);}}catch (Exception e){throw new RuntimeException("接收端失败");}}}class  ChatDemo{public static void main(String[] args) throws Exception{DatagramSocket sendSocket = new DatagramSocket();DatagramSocket receSocket = new DatagramSocket(10002);new Thread(new Send(sendSocket)).start();new Thread(new Rece(receSocket)).start();}}



TCP

需求:建立一个文本转换服务器。
客户端给服务端发送文本,服务单会将文本转成大写在返回给客户端。
而且客户度可以不断的进行文本转换。当客户端输入over时,转换结束。

分析:
客户端:
既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考。
源:键盘录入。
目的:网络设备,网络输出流。
而且操作的是文本数据。可以选择字符流。

步骤
1,建立服务。
2,获取键盘录入。
3,将数据发给服务端。
4,后去服务端返回的大写数据。
5,结束,关资源。

都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲。

*/
import java.io.*;
import java.net.*;
class  TransClient
{
    public static void main(String[] args) throws Exception
    {
        Socket s = new Socket("192.168.1.254",10005);


        //定义读取键盘数据的流对象。
        BufferedReader bufr =
            new BufferedReader(new InputStreamReader(System.in));


        //定义目的,将数据写入到socket输出流。发给服务端。
        //BufferedWriter bufOut =
            //new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        PrintWriter out = new PrintWriter(s.getOutputStream(),true);


        //定义一个socket读取流,读取服务端返回的大写信息。
        BufferedReader bufIn =
            new BufferedReader(new InputStreamReader(s.getInputStream()));

        String line = null;
        
        while((line=bufr.readLine())!=null)
        {
            if("over".equals(line))
                break;
            
            out.println(line);
//            bufOut.write(line);
//            bufOut.newLine();
//            bufOut.flush();

            String str =bufIn.readLine();
            System.out.println("server:"+str);
            
        }

        bufr.close();
        s.close();

    }
}
/*
服务端:
源:socket读取流。
目的:socket输出流。
都是文本,装饰。
*/

class  TransServer
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket ss = new ServerSocket(10005);

        Socket s = ss.accept();
        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip+"....connected");

        //读取socket读取流中的数据。
        BufferedReader bufIn =
            new BufferedReader(new InputStreamReader(s.getInputStream()));

        //目的。socket输出流。将大写数据写入到socket输出流,并发送给客户端。
        //BufferedWriter bufOut =
            //new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

        PrintWriter out = new PrintWriter(s.getOutputStream(),true);

        String line = null;
        while((line=bufIn.readLine())!=null)
        {

            System.out.println(line);

            out.println(line.toUpperCase());
//            bufOut.write(line.toUpperCase());
//            bufOut.newLine();
//            bufOut.flush();
        }

        s.close();
        ss.close();

    }
}
/*
该例子出现的问题。
现象:客户端和服务端都在莫名的等待。
为什么呢?
因为客户端和服务端都有阻塞式方法。这些方法么没有读到结束标记。那么就一直等
而导致两端,都在等待。
*/



复制文本程序

import java.io.*;
import java.net.*;

class  TextClient
{
    public static void main(String[] args) throws Exception
    {
        Socket s = new Socket("192.168.1.254",10006);

        BufferedReader bufr =
            new BufferedReader(new FileReader("IPDemo.java"));


        PrintWriter out = new PrintWriter(s.getOutputStream(),true);


        String line = null;
        while((line=bufr.readLine())!=null)
        {
            out.println(line);
        }

        s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1.

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

        String str = bufIn.readLine();
        System.out.println(str);

        bufr.close();

        s.close();
    }
}
class  TextServer
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket ss = new ServerSocket(10006);

        Socket s = ss.accept();
        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip+"....connected");


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

        PrintWriter out  = new PrintWriter(new FileWriter("server.txt"),true);

        String line = null;

        while((line=bufIn.readLine())!=null)
        {
            //if("over".equals(line))
                //break;
            out.println(line);
        }

        PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
        pw.println("上传成功");

        out.close();
        s.close();
        ss.close();

    }
}

原创粉丝点击