网络编程

来源:互联网 发布:阿里云虚拟主机这么用 编辑:程序博客网 时间:2024/05/01 07:22

网络编程三要素

IP,端口,协议。

一、IP:在网络上的唯一标识,其实每台电脑连接互联网都有自己的IP分配值,之前都是IPv4的但在2011年已经用尽,现在正向ipv6时代迈进

二、端口:在设备上的唯一标识,范围在0--65535之间,编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。

三、协议: 为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
 UDP
     面向无连接,数据不安全,速度快。不区分客户端与服务端。
 TCP
  面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
    三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据

 Socket套接字
       网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
      通信的两端都有Socket。
      网络通信其实就是Socket间的通信。
      数据在两个Socket间通过IO流传输。
      Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port

UDP的传输

 发送Send
     创建DatagramSocket, 随机端口号
     创建DatagramPacket, 指定数据, 长度, 地址, 端口
     使用DatagramSocket发送DatagramPacket
     关闭DatagramSocket

public static void main(String[] args) throws IOException {String s = "qubuqusaniao";//要发送的数据DatagramSocket ds = new DatagramSocket();//创建Socket对象     相当于创建码头DatagramPacket dsp =                  //创建Packet 相当于创建集装箱new DatagramPacket(s.getBytes(), s.getBytes().length,InetAddress.getByName("127.0.0.1"),12345);ds.send(dsp);                    //发送数据ds.close();}
 接收Receive
     创建DatagramSocket, 指定端口号
     创建DatagramPacket, 指定数组, 长度
     使用DatagramSocket接收DatagramPacket
     关闭DatagramSocket
     从DatagramPacket中获取数据
public static void main(String[] args) throws IOException {DatagramSocket socket = new DatagramSocket(12345);        //创建Socket相当于创建一个码头DatagramPacket packet = new DatagramPacket(new byte[1024],1024);//创建Packet相当于创建一个集装箱socket.receive(packet);byte[] arr = packet.getData();                   //从集装箱中获取数据int len = packet.getLength();                   //获取发过来的有效字节个数System.out.println(new String(arr,0,len));socket.close();}

UDP传输的优化

send

public static void main(String[] args) throws IOException {DatagramSocket ds = new DatagramSocket();//创建Socket对象     相当于创建码头Scanner sc = new Scanner(System.in);//键盘录入while(true){String line = sc.nextLine();//接收键盘录入内容if("quit".equals(line)){    //相当于图形化界面的差号break;}DatagramPacket dsp =                  //创建Packet 相当于创建集装箱new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("127.0.0.1"),12345);ds.send(dsp);                    //发送数据}ds.close();}
<strong>receive</strong>
public static void main(String[] args) throws IOException {DatagramSocket socket = new DatagramSocket(12345);        //创建Socket相当于创建一个码头DatagramPacket packet = new DatagramPacket(new byte[1024],1024);//创建Packet相当于创建一个集装箱while(true){socket.receive(packet);byte[] arr = packet.getData();                   //从集装箱中获取数据int len = packet.getLength();                   //获取发过来的有效字节个数String ip = packet.getAddress().getCanonicalHostName();//获取IP地址int port = packet.getPort();                     //获取端口号System.out.println(ip + ":" + port + ":" + new String(arr,0,len));}}}

TCP传输
客户端

普通方式和优化方式

public static void main(String[] args) throws UnknownHostException, IOException {//demo();Socket socket = new Socket("127.0.0.1",9999);//创建Socket,并指定IP和端口号BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//对输入流包装PrintStream ps = new PrintStream(socket.getOutputStream());ps.println("坚持坚持在坚持");//向服务器写出数据System.out.println(br.readLine());//读取服务器的内容并打印socket.close();}private static void demo() throws UnknownHostException, IOException {Socket socket = new Socket("127.0.0.1",9999);//创建Socket,并指定IP和端口号InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream();byte[] arr = new byte[1024];int len = is.read(arr);System.out.println(new String(arr,0,len));os.write("因为一分耕耘一分收获".getBytes());}}
服务端

普通方式

private static void demo() throws IOException {ServerSocket server = new ServerSocket(9999);//创建ServerSocket t对象并连接端口Socket socket = server.accept();              //接收客户端的请求InputStream is = socket.getInputStream();      //获取输入流OutputStream os = socket.getOutputStream();// 获取输出流os.write("坚持学习".getBytes());       //字符串写到客户端byte[] arr = new byte[1024];     //创建字节数组int len = is.read(arr);           //将数据读取到字节数组中System.out.println(new String(arr,0,len));//将数组转化为字符串server.close();socket.close();}
优化方式

private static void demo1() throws IOException {ServerSocket server = new ServerSocket(9999);//创建ServerSocket t对象并连接端口Socket socket = server.accept();              //接收客户端的请求BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//对输入流包装PrintStream ps = new PrintStream(socket.getOutputStream());System.out.println(br.readLine());//读取服务器的内容并打印ps.println("虽然很艰难");         //向服务器写出数据socket.close();//关闭套接字,顺便关闭流}
多线程方式

public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(9999);//创建ServerSocket t对象并连接端口while(true){final Socket socket = server.accept();   //接收客户端的请求new Thread(){public void run(){try {BufferedReader br= new BufferedReader(new InputStreamReader(socket.getInputStream()));//对输入流包装PrintStream ps = new PrintStream(socket.getOutputStream());System.out.println(br.readLine());//读取服务器的内容并打印ps.println("虽然很艰难");         //向服务器写出数据socket.close();//关闭套接字,顺便关闭流} catch (IOException e) {e.printStackTrace();}}}.start();

练习:客户端向服务器写字符串,服务器将字符串反转后写回,客户端再次读取到是反转后的字符串

客户端:

public static void main(String[] args) throws UnknownHostException, IOException {Socket socket = new Socket("127.0.0.1", 23445);//创建客户端对象并指定IP和端口BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintStream ps = new PrintStream(socket.getOutputStream());Scanner sc = new Scanner(System.in);ps.println(sc.nextLine());       //将键盘录入的字符串放在服务器中System.out.println(br.readLine());//打印反转后的字符串socket.close();}
服务端:
public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(23445);//创建服务端服务器,并连接端口System.out.println("服务器启动");while(true){final Socket socket = server.accept();//接受客户端的数据new Thread(){public void run(){try {BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintStream ps = new PrintStream(socket.getOutputStream());String line = br.readLine();//获取字符串line = new StringBuilder(line).reverse().toString();//将字符串放在Stringbuilder中反转并转回字符串socket.close();} catch (IOException e) {e.printStackTrace();}}}.start();}


<pre name="code" class="java">

0 0