java.网络编程

1.UDP/TCP

网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。

java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。

java.net 包中提供了两种常见的网络协议的支持:

  • TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。

  • UDP:UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。

2.套接字(Socket)

DatagramSocket  //用于UDP 通讯
Socket //用于TCP通讯的客户端
ServerSocket //用于TCP通讯的服务端

3.UDP

1)InetAddress 类  ,InetAddress 表示互联协义(IP)地址

2)发送端
          
          1) 建立套接字  DatagramSocket   socket=new DatagramSocket ();
          2) 准备数据      DatagramPacket   packet=new DatagramPacket (byte[],len,InetAddress,port);
          3) 调用 套接字服务,进行发送   socket.send(packet);
          4) 关闭资源 套接字   socket.close();

  接收端

         1) 建立套接字  DatagramSocket   socket=new DatagramSocket ();
          2) 准备 DatagramPacket 用来接收数据   DatagramPacket   packet=new DatagramPacket (byte[],len);
          3) 调用 套接字 提供的方法进行接收   socket.receive(packet);
          4) 从DatagramPacket把接到的数据取出来  packet.getData;
          5) 关闭资源   socket.close();

4.TCP

TCP服务端
             1) 创建服务端的套接字ServerSocket ,指定在某个端口上监听   ServerSocket serverSocket=new ServerSocket(port);
             2) 调用accpet() 方法得到客户端的套接字对象  serverSocket.accpet();
             3) 从得到的套接字对象上,得到输入流,可以接收数据,得到输出流,发送数据serverSocket.accpet().getInputStream;
             4) 关闭资源 serverSocket.close();

客户端 
    1) 建立套接字  Socket socket=new Socket(InetAddress, port);
    2) 建一个输入流,接收键盘数据(用缓冲流)  socket.getInputStream();
    3) 得到输出流,把数据写入
    4) 得到输入流,把变成大写的数据接收回来
    5) 清理资源

5.实例

发送端
    import java.net.*;
		import java.io.*;
		class TransClient
		{
				public static void main(String [] args) throws Exception
				{
						//建立套接字
						Socket socket=new Socket("127.0.0.1", 8000);
						
						//键盘输入流
						BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
						
						//建立通向服务端的输出流
						BufferedWriter bw=new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()));
						
						//建立从服务端接收数据的输入流,接收变成大写之后的字符
						BufferedReader brReslut=new BufferedReader(new InputStreamReader( socket.getInputStream()));
						
						String msg=null;
						while((msg=br.readLine())!=null)
						{
								bw.write(msg);
								bw.newLine();  //不要忘
								bw.flush();  //不要忘
								
								//接收变成大写之后的字符串
								System.out.println(brReslut.readLine());
						}
						
						socket.close();
						br.close();
						bw.close();
						brReslut.close();
				}
		}
    
    服务端
		import java.net.*;
		import java.io.*;
		class TransServer
		{
				public static void main(String [] args) throws Exception
				{
						ServerSocket serverSocket=new ServerSocket(8000);
						
						Socket clientSocket=serverSocket.accept();  //等待客户端连上来
						
						BufferedReader br=new BufferedReader(new InputStreamReader(	clientSocket.getInputStream()));   //得到输入流,为了处理方便,包装成了缓冲流
						BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
						
					  //处理
					  String msg=null;
					  while((msg=br.readLine())!=null){
					  		msg=msg.toUpperCase();
					  		bw.write(msg);
					  		bw.newLine(); //不要忘
					  		bw.flush();  //不要忘
					  }
					  
					  serverSocket.close();
					  clientSocket.close();
					  bw.close();
					  br.close();
			
				}
		}
		    
		    
		//例子 图片上传
		客户端		
		import java.io.*;
		import java.net.*;
		class ImgClient
		{
				public static void main(String  [] args) throws Exception
				{
						Socket socket=new Socket("127.0.0.1",8800);
						
						//文件输入流,代表要被上传的图片
						InputStream in=new FileInputStream("c:/image/lengtu.jpg");
						
						//得到通往服务端的输出流
						OutputStream out =socket.getOutputStream();
						
						byte[] buff= new byte[1024];
						
						int len=0;
						
						//开始传送
						while((len=in.read(buff))!=-1){
								out.write(buff,0,len);
						}
						
						socket.shutdownOutput();  //主动停止输入流,相当于在输入流中加一个结束标记
						
						//接收服务端返回的信息
					  BufferedReader brResult= new BufferedReader(new InputStreamReader(socket.getInputStream()));
					  System.out.println(brResult.readLine());
					  
					  socket.close();
					  in.close();
					  brResult.close();
					  out.close();
				}
		
		}
				
		服务端	
		import java.net.*;
		import java.io.*;
		class ImgServer {
				public static void main(String  []  atgs) throws Exception
				{
						ServerSocket serverSocket =new ServerSocket(8800);
						Socket clientSocket=serverSocket.accept();
							
						//建立一个输出流对象,表示传上来的文件要存放的位置
						String senderIp=clientSocket.getInetAddress().getHostAddress();
						OutputStream out=new FileOutputStream("c:/upload/"+senderIp+".jpg");
						
						//取出客户端传上来的数据
						InputStream in= clientSocket.getInputStream();
						
						int len=0;
						byte [] buff=new byte[1024];
						//处理
						while((len=in.read(buff))!=-1){
							out.write(buff,0,len);
						}
						
						//告诉对方,传输成功
				 /*	BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutPutStream()));
						bw.write("图片上传成功");
						bw.newLine();
						bw.flush();  */
						
						PrintWriter pw=new PrintWriter(clientSocket.getOutputStream());
						pw.println("图片上传成功");
						pw.flush();
						
						serverSocket.close();
						clientSocket.close();
						out.close();
						in.close();
				
				}		
		}

 

上一篇:Java 字符串输出到文件中,不会因为数据过大导致堆内存崩了


下一篇:Java学习:缓冲流