java基础16_网络编程

网络概念

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

连接,服务器端向客户端写入数据,客户端向服务器端读入数据:

package java基础.Socket;
import java.net.*;
import java.io.*;
/**
 * 要  点:
 *  1. Java Socket编程步骤
 *  2. Socket/ServerSocket类用法
 *  3. 通过Socket对象可以获取通信对方Socket的信息
 * @author Jobs1127
 */
public class TestServer {
    public static void main(String args[]) {
        try {       
            /*
             *服务器端new一个ServerSocket对象,占据一个端口
             *如果服务器端已经占据了某个端口,再尝试去占用的话,就报异常java.net.BindException: Address already in use: JVM_Bind
             */
            ServerSocket s = new ServerSocket(8881);
            while (true) {
                System.out.println("服务器端已经进入,正在等待接收客户端的Socket");
                /**
                 * 该应用程序一启动就会打印该句话,一旦客户端连接上来,即服务器端监听到Socket,进入这里也会打印一次,每次有连接进来都会打印
                 */
                Socket s1 = s.accept();//不停的监听连接上来的Socket
                if(s1 != null) {
                    OutputStream os = s1.getOutputStream();//服务器端拿到输出管道,准备给客户端输出写入数据
                    DataOutputStream dos = new DataOutputStream(os);//包装成数据流DataOutputStream
                    dos.writeUTF("Hello," + s1.getInetAddress() + 
                            "port#" +s1.getPort() + "  bye-bye!");
                    dos.flush();
                    dos.close();
                    s1.close();
                }
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package java基础.Socket;
import java.net.*;
import java.io.*;
/**
 * 要  点:
 *  1. Java Socket编程步骤
 *  2. Socket/ServerSocket类用法
 *  3. 通过Socket对象可以获取通信对方Socket的信息
 * @author Jobs1127
 * 服务器端Server,客户端Client,服务器端往客户端传输数据即写入到客户端,一般对应OutputStream
 * 客户端往服务器端传输数据一般对应的管道为InputStream
 */
public class TestClient {
    public static void main(String args[]) {
        try {
            Socket s1 = new Socket("127.0.0.1", 8881);//new一个连接服务器的Socket,对应好ip和端口
            InputStream is = s1.getInputStream();//拿到读入流
            DataInputStream dis = new DataInputStream(is);//包装读入流为数据流
            System.out.println("已连接上服务器,"+dis.readUTF());//读服务器的数据
            dis.close();
            s1.close();
        } catch (ConnectException connExc) {
            connExc.printStackTrace();
            System.out.println("服务器连接失败");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

程序演示,服务器端和客户端通过输入InputStream输出流OutputStream,包装成数据流DataOutputStream,可以通过写入到writeUTF(),和读入到readUTF(),实现互相通讯

package java基础.Socket;
import java.io.*;
import java.net.*;
/**
 * 服务器端
 * @author Jobs1127
 *
 */
public class TestSockServer {
    public static void main(String[] args) {
        InputStream in = null;
        OutputStream out = null;
        int i = 0;
        try {
            ServerSocket ss = new ServerSocket(5888);
            System.out.println("服务器端监听5888端口"+i++);
            Socket socket = ss.accept();//没有放在死循环里,只要服务器端监听并接收了客户端的Socket就马上关闭服务器
            if(socket != null) {
                in = socket.getInputStream();
                out = socket.getOutputStream();
                DataOutputStream dos = new DataOutputStream(out);
                DataInputStream dis = new DataInputStream(in);
                String s = null;
                if ((s = dis.readUTF()) != null) {
                    System.out.println(s);
                    System.out.println("from: " + socket.getInetAddress());
                    System.out.println("Port: " + socket.getPort());
                }
                dos.writeUTF("hi 客户端");
                dis.close();
                dos.close();
                socket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package java基础.Socket;
import java.net.*;
import java.io.*;
/**
 * 客户端
 * @author Jobs1127
 *
 */
public class TestSockClient {
    public static void main(String[] args) {
        InputStream is = null;
        OutputStream os = null;
        try {
            /**
             * java.net.ConnectException: Connection refused: connect
             * 如果服务器端没有监听该端口,尝试去访问该端口,就会报上面异常
             */
            Socket socket = new Socket("localhost", 5888);
            is = socket.getInputStream();
            os = socket.getOutputStream();
            DataInputStream dis = new DataInputStream(is);
            DataOutputStream dos = new DataOutputStream(os);
            dos.writeUTF("hey servers");
            String s = null;
            if ((s = dis.readUTF()) != null);
            System.out.println(s);
            dos.close();
            dis.close();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

包装输出、输入流来实现服务器端和客户端的交流互动
BufferedReader可以读取一行readLine(),PrintWriter可以打印写入一行

package java基础.Socket;

import java.io.*;
import java.net.*;
import java.applet.Applet;

public class talkserver {
    public static void main(String args[]) {
        try {
            ServerSocket server = null;
            try {
                server = new ServerSocket(4700);
            } catch (Exception e) {
                System.out.println("can not listen to:" + e);
            }
            Socket socket = null;
            try {
                socket = server.accept();
            } catch (Exception e) {
                System.out.println("Error:" + e);
            }
            String line;
            BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter os = new PrintWriter(socket.getOutputStream());
            BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Client:" + is.readLine());
            line = sin.readLine();
            /**
             * 只要不输入bye,就不关闭管道,即不关闭连接
             */
            while (!line.equals("bye")) {
                os.println(line);
                os.flush();
                System.out.println("Server:" + line);
                System.out.println("Client:" + is.readLine());
                line = sin.readLine();
            }
            is.close();
            os.close();
            socket.close();
            server.close();
        } catch (Exception e) {
            System.out.println("Error" + e);
        }
    }
}
package java基础.Socket;

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

public class talkclient {
    public static void main(String args[]) {
        try {
            Socket socket = new Socket("127.0.0.1", 4700);
            BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter os = new PrintWriter(socket.getOutputStream());
            BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String readline;
            readline = sin.readLine();
            /**
             * 只要不输入bye,就不关闭管道,即不关闭连接
             */
            while (!readline.equals("bye")) {
                os.println(readline);
                os.flush();
                System.out.println("Client:" + readline);
                System.out.println("Server:" + is.readLine());
                readline = sin.readLine();
            }
            os.close();
            is.close();
            socket.close();
        } catch (Exception e) {
            System.out.println("Error" + e);
        }
    }
}

测试TCP:

package java基础.Socket;
import java.net.*;
import java.io.*;
public class TCPServer {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(6666);
        while (true) {
            Socket s = ss.accept();
            System.out.println("a client connect!");
            DataInputStream dis = new DataInputStream(s.getInputStream());
            System.out.println(dis.readUTF());
            dis.close();
            s.close();
        }
    }
}
package java基础.Socket;
import java.net.*;
import java.io.*;

public class TCPClient {
    public static void main(String[] args) throws Exception {
        Socket s = new Socket("127.0.0.1", 6666);
        OutputStream os = s.getOutputStream();
        DataOutputStream dos = new DataOutputStream(os);
        Thread.sleep(30000);
        dos.writeUTF("hello server!");
        dos.flush();
        dos.close();
        s.close();
    }
}

测试UDP:

package java基础.Socket;
import java.net.*;
import java.io.*;

public class TestUDPServer {
    public static void main(String args[]) throws Exception {
        byte buf[] = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        DatagramSocket ds = new DatagramSocket(5678);
        while (true) {
            ds.receive(dp);
            ByteArrayInputStream bais = new ByteArrayInputStream(buf);
            DataInputStream dis = new DataInputStream(bais);
            System.out.println(dis.readLong());
        }
    }
}
package java基础.Socket;

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

public class TestUDPClient {
    public static void main(String args[]) throws Exception {
        long n = 10000L;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(baos);
        dos.writeLong(n);

        byte[] buf = baos.toByteArray();
        System.out.println(buf.length);

        DatagramPacket dp = new DatagramPacket(buf, buf.length,
                new InetSocketAddress("127.0.0.1", 5678));
        DatagramSocket ds = new DatagramSocket(9999);
        ds.send(dp);
        ds.close();
    }
}

根据网络编程编写的聊天程序:

package java基础.Socket.myChat1;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ChatServer {
    public static void main(String[] args) {
        //服务器端建立监听
        ServerSocket ss = IoTools.getServerSocket(9999);
        try {
            Socket s = ss.accept();//服务器已经建立了监听,如果没有监听到客户端的连接,是不会往下执行的,监听到连接后开始往下执行
            System.out.println("一个客户端已经和服务器端建立了连接");
            //开始通讯
            IoTools.read_UTF(s);//服务器端读取客户端发送过来的信息,通过Socket桥梁去读取
            String context = "server say:hi client!";
            IoTools.send_UTF(s, context);

            //要和客户端端聊天,只要不输入bye就不结束聊天,通过BufferedReader/PrintWriter测试通讯
            System.out.println("haha0-----");
            System.out.println("client say:"+IoTools.read_buf_socket(s));//读取客户端发来的信息,如果在s管道里没有读取到,则停留在这里等待,直到读取成功才往下执行
            System.out.println("haha1---");
            String str = IoTools.read_buf_system_in(System.in);
            System.out.println("end haha---");//如果没有服务器端没有输入,程序执行不到这里,一直等待输入,只有输入了才会往下执行

            while(!str.equalsIgnoreCase("bye")) {
                IoTools.send_buf(s,str);//服务器端尝试从Socket管道发送数据给服务器端
                System.out.println("server say:"+str);
                System.out.println("client say:"+IoTools.read_buf_socket(s));//读取客户端发来的信息
                str = IoTools.read_buf_system_in(System.in);
            }
            //通讯结束后,关闭相关资源,断开连接
            IoTools.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package java基础.Socket.myChat1;

import java.net.Socket;

public class ChatClient {
    public static void main(String[] args) {
        //与服务器端建立连接
        Socket s = IoTools.getClientSokect("localhost", 9999);
        System.out.println("与服务器端建立连接");
        //开始通讯
        //通过DataOutputStream/DataInputStream测试通讯
        String context = "client say:我要给服务器发送一条信息,hi,chatserver";
        IoTools.send_UTF(s,context);
        IoTools.read_UTF(s);
        //要和服务器端聊天,只要不输入bye就不结束聊天,通过BufferedReader/PrintWriter测试通讯
        String str = IoTools.read_buf_system_in(System.in);
        while(!str.equalsIgnoreCase("bye")) {
            IoTools.send_buf(s,str);//客户端尝试从Socket管道发送数据给服务器端
            System.out.println("client say:"+str);
            System.out.println("server say:"+IoTools.read_buf_socket(s));//读取服务器端发来的信息
            str = IoTools.read_buf_system_in(System.in);
        }
        //结束通讯后,关闭相关资源
        IoTools.close();
    }
}
package java基础.Socket.myChat1;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * 封装Io操作数据的方法
 * @author Jobs1127
 *
 */
public class IoTools {
    public static ServerSocket ss = null;//服务器端Socket
    public static Socket s = null;//客户端Socket
    /**
     * DataInputStream提供了readUTF()
     */
    public static DataInputStream di = null;
    /**
     * BufferedReader提供了readLine(),readLine() 
            读取一个文本行。
     */
    public static BufferedReader br = null;
    public static BufferedReader bre = null;
    public static InputStreamReader ir = null;

    /**
     * DataOutputStream提供了writeUTF();
     * writeUTF(String str) 
            以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。
     */
    public static DataOutputStream dout = null;
    /**
     * PrintWriter提供了println();println(String x) 
            打印 String,然后终止该行。
     */
    public static PrintWriter pw = null;
    public static PrintWriter pwe = null;

    public static DataInputStream getDataInputStream(InputStream in) {
        di = new DataInputStream(in);
        return di;
    }
    public static DataOutputStream getDataOutputStream(OutputStream out) {
        dout = new DataOutputStream(out);
        return dout;
    }

    public static BufferedReader getBufferedReader(InputStream in) {
        ir = new InputStreamReader(in);
        br = new BufferedReader(ir);
        return br;
    }
    public static PrintWriter getPrintWriter(OutputStream out) {
        pw = new PrintWriter(out);
        return pw;
    }
    public static ServerSocket getServerSocket(int port) {
        try {
            ss = new ServerSocket(port);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ss;
    }
    public static Socket getClientSokect(String host,int port) {
        try {
            s = new Socket(host,port);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return s;
    }
    public static void send_UTF(Socket s,String context) {
        try {
            if(dout == null) {
                dout = new DataOutputStream(s.getOutputStream());
            }
            dout.writeUTF(context);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void read_UTF(Socket s) {
        try {
            if(di == null) {
                di = new DataInputStream(s.getInputStream());
            }
            System.out.println(di.readUTF());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void send_buf (Socket s,PrintWriter pw,String str) {
        try {
            pw = new PrintWriter(s.getOutputStream());
            pw.println(str);
            pw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 往同一根管道里写入数据
     * @param s
     * @param str
     */
    public static void send_buf(Socket s,String str) {
        try {
            pw = new PrintWriter(s.getOutputStream());
            pw.println(str);//把内存里的数据,写入到服务器端
            pw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static String read_buf_socket(Socket s) {
        String str = null;
        try {
            br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }
    public static String read_buf_system_in(InputStream in) {
        String str = null;
        try {
            bre = new BufferedReader(new InputStreamReader(in));
            str = bre.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }
    /**
     * 关闭资源
     */
    public static void close() {
        try {
            if (di != null) {
                di.close();
            }
            if (dout != null) {
                dout.close();
            }
            if(ir != null) {
                ir.close();
            }
            if(br != null) {
                br.close();
            }
            if(bre != null) {
                bre.close();
            }
            if(pw != null) {
                pw.close();
            }
            if(pwe != null) {
                pwe.close();
            }
            if(ss != null) {
                ss.close();
            }
            if(s != null) {
                s.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值