JAVA网络编程(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a592381841/article/details/84996254

一、概念

Sockets:

使用TCP协议实现的网络通信Socket相关的类

Datagram:

使用UD协议,将数据保存在用户数据报中,通过网络进行通讯。

Socket在应用层之下,传输层之上的接口层(操作系统提供给用户访问网络的系统接口)

Socket套接字:

网络上具有唯一标识的IP地址和端口组合一起才能构成唯一能识别的标识符套接字。

       Socket原理机制:

                         通信的两端都有Socket

                         网络通信其实就是Socket间的通信

                          数据在两个socket传送是通过IO流

二、TCP编程

 java中基于TCP协议实现网络通信的类

   客户端: Socket

   服务端:serverSocket

2-1:socket通信的步骤

  1. 创建serverSocket和Socket
  2. 打开连接到socket的输入和输出流
  3. 按照协议对socket进行读/写操作
  4. 关闭输入/输出流,关闭socket

2-1-1:服务器端

  1. 创建ServerSocket对象,继续监听端口
  2. 通过accept()方法监听客户端请求
  3. 连接建立后,通过输入流读取客户端发送的请求信息
  4. 通过输出流向客户端发送响应信息
  5. 关闭相关资源
  6. package com.demo.demo.demo2;
    
    import java.io.BufferedReader;
    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;
    
    public class TcpServer {
    	public static void main(String[] args) throws IOException {
    		//创建一个服务器端的socket,指定端口,并监听该端口
    		ServerSocket sc=new ServerSocket(80);
    		try {
    			//
    			Socket scc=sc.accept();
    		   InputStream in= scc.getInputStream();
    		   InputStreamReader inr=new InputStreamReader(in);
    		   BufferedReader br= new BufferedReader(inr);
    		   String info=null;
    		   while((info=br.readLine())!=null){
    			   System.out.println("客户端:"+info);
    		   }
    		   //socket关闭输入流
    		  scc.shutdownInput();
    		  OutputStream out=scc.getOutputStream();
    		  PrintWriter ww=new PrintWriter(out);
    		  ww.write("你好啊。客户端");
    		  ww.flush();
    		  scc.shutdownOutput();
    		  ww.close();
    		  out.close();
    		  br.close();
    		  inr.close();
    		  in.close();
    		  scc.close();
    		  sc.close();
    		  
    			
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}
    
    }
    

2-1-2客户端

  1. 创建socket对象,指明需要连接的服务器的地址和端口号
  2. 连接建立后。通过输出流向服务器端发送请求信息
  3. 通过输入流获得服务器相应的信息
  4. 关闭相关信息
package com.demo.demo.demo2;

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

public class TcpClient {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket sc=new Socket("localhost",80);
		OutputStream oo=sc.getOutputStream();
		PrintWriter pr=new PrintWriter(oo);
		pr.write("我是一号客户端");
		pr.flush();
		sc.shutdownOutput();
		InputStream is=sc.getInputStream();
		InputStreamReader re=new InputStreamReader(is);
		BufferedReader rrr=new BufferedReader(re);
		String info=null;
		while((info=rrr.readLine())!=null){
			System.out.println(info);
		}
		
		sc.shutdownInput();
		rrr.close();
		re.close();
		re.close();
		pr.close();
		oo.close();
		
	}

}

2-1-3:套接字超时(客户端)

             1. 可为套接字设置超时操作,即:当读写操作没有在规定时间内完成,则会抛出SocketTimeoutException异常

                           通过方法:  setSoTimeout(毫秒数)   设置

              2. new 出socket(String host,int port),这个socket会一直阻塞,直到建立起初始连接为止。

                           可先建立无连接的套接字,再使用一个超时来连接的方式解决问题。

         

//--------当socket没有建立起与主机的初始连接,会一直阻塞----------------
Socket s=new Socket("192.168.1.1","80")

//-----------------------解决方式---------------------10s---
Socket s=new Socket();
s.connect(new InetSocketAddress("192.168.1.1","80"),10000 );

2-1-4:关于因特网地址

package com.demo.demo.demo2;

import java.net.InetAddress;
import java.net.UnknownHostException;
public class InternetAdd {
	public static void main(String[] args) throws UnknownHostException {
		InetAddress[] an=InetAddress.getAllByName("www.baidu.com");
		
		for(InetAddress a :an){
			System.out.println(a);
		}
		
		
		
	}
}

2-1-5:应用多线程实现服务器与多客户端之间的通信

  1. 服务器端创建ServerSocket,循环调用accept()等待客户端连接
  2. 客户端创建一个socket并请求与服务器端连接。
  3. 服务器接受请求,创建socket与客户端建立专线连接
  4. 建立连接的两个socket在一个单独的线程上对话
  5. 服务器继续等待新的连接

三、UDP编程

UDP协议(用户数据报协议)是无连接的,不可靠的,无序的,速度的

         进行数据传输中,首先将要传输的数据定义为数据报,大小限制为64k,在数据报中指明数据所要达到的Socket(主机地址和端口号),然后再将数据报发送出去

         DatagramPacket类:表示数据报包

         DatagramSocket类 :进行端到端通信的类

 

3-1:服务器端实现步骤

         创建DatagramSocket,指定端口号

         创建DatagramSocket

         接收客户端发送的数据信息

         读取数据

3-2:客户端实现步骤

定义发送信息

创建DatagramPacket,包含将要发送的信息

创建DatagramSocket

发送数据

四、注意

猜你喜欢

转载自blog.csdn.net/a592381841/article/details/84996254