学习网络编程,代码程序思路,讲解分析,1.client/server程序完成下载文件。一个服务端对应多个客户端

本文深入探讨了Java网络编程的基础,重点介绍了TCP与UDP两种传输协议,通过Socket实现Client/Server模型。从一对一到一对多的场景,详细解析了如何利用多线程管理多个客户端连接,包括代码实例,如文件下载功能的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.知识核心

  • 两类传输协议:TCP;UDP
  • 基于Socket的java网络编程
  • 简单的Client/Server程序
  • 支持多客户的client/server程序(多线程)

2.代码优化

  • 我们代码是一对一。但是要一个服务端对应多个客户端。
  • 则我们要服务端用多线程管理客户端。
  • 技术:死循环等待客户端连接。生成socket,
  • 通过socket启动一个线程,参数是一个socket,并通过集合加入socket,管理socket,(可以建立类管理)。线程就是管理客服端的需求。
  • 聊天室:技术,就是集合管理socket,循环给每一个客户端发客户端的信息。

3.代码案例一对一

  • 文件下载

  • 客户端输出文件名。服务端给对应文件

  • 思路:服务端得到文件名。找到文件。传文件字符数组

  • 客户端得到字符数组,写入文件。完成下载文件

  • 实现:服务端得到一个文件名,调用一个方法,得到字符数组。

  • 后传给客户端

  • 客户端调用一个方法,把字符数组写入一个新建文件。

  • 代码

  • 服务端:

    • `public class Server {

      public static void main(String[] args) {

      //服务器端的套接字定义
      ServerSocket server=null;

      //服务器接收客户端的套接字
      Socket socket=null;

      //输入流,输出流定义
      DataOutputStream dataout=null;
      OutputStream out=null;

       DataInputStream datain=null;
       InputStream  in=null;
      

      //创建服务器端的套接字,并且监听客户端
      try {
      server=new ServerSocket(4331);
      System.out.println(“server:0000000000”);
      socket=server.accept();//阻塞
      System.out.println(“server:1111111111”);
      System.out.println(socket);
      } catch (IOException e) {
      e.printStackTrace();
      }

      try {
      //接受数据
      in=socket.getInputStream();
      datain=new DataInputStream(in);
      System.out.println(“server:2222222222”);
      String clientread=datain.readUTF(); //阻塞
      char[] buf=coputxt(clientread);
      // String res = new String(buf,“UTF-8”);
      // System.out.println(buf);
      // System.out.println(res);

        //发送数据
         out=socket.getOutputStream();
         dataout=new DataOutputStream(out);
         String string=new String(buf);
         dataout.writeUTF(string);
      

      } catch (IOException e) {
      e.printStackTrace();
      }

      //关闭资源
      try {
      server.close();
      socket.close();
      in.close();
      datain.close();
      out.close();
      dataout.close();
      } catch (IOException e) {
      e.printStackTrace();
      }

    }

    public static char[] coputxt(String a) {
    File file1=new File(a);
    char[] buf1 = null;
    try {
    FileInputStream fileInputStream=new FileInputStream(file1);
    FileReader reader=new FileReader(file1);
    int size=(int)file1.length();
    buf1=new char[size];
    reader.read(buf1);
    System.out.println(buf1);
    // buf=new byte[size];
    // fileInputStream.read(buf);
    // String res = new String(buf,“UTF-8”);
    // System.out.println(res);
    fileInputStream.close();
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

     return buf1;
    

    }

    }`
    客户端:

package com.gunjun.serverandclient;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 客户端
 * @author admin
 *
 */
public class Client {

	public static void main(String[] args) {
		
		//客户端套接字定义
		Socket mysocket=null;
		
		//输入流,输出流定义
				DataOutputStream dataout=null;
				OutputStream out=null;		
				
				DataInputStream datain=null;
				InputStream  in=null;
				
		
		//创建客户端套接字
		 try {
			   mysocket = new Socket("localhost",4331);
			   //mysocket = new Socket("127.0.0.1",4331);
			   //mysocket = new Socket("192.168.32.52",4331);
				System.out.println("client:00000000");
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		 
		 
		 try {
			 //写数据
			out=mysocket.getOutputStream();
			dataout=new DataOutputStream(out);
			dataout.writeUTF("employee.txt");
			
			
			//读数据
			in=mysocket.getInputStream();
			datain=new DataInputStream(in);
			
		    String serverread=datain.readUTF();
//			System.out.println(serverread);
//			byte[] bs = serverread.getBytes();
			copytxt(serverread);
			System.out.println(serverread);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		 
		 
		//关闭资源
		  try {
				
				 mysocket.close();
				 out.close();
				 dataout.close();
				 in.close();
				 datain.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		 
		 
	}
	public static  void copytxt(String buf) {
		File file1=new File("employeecopy.txt");
	 
			try {
//				FileOutputStream fileOutputStream=new FileOutputStream(file1);
//				fileOutputStream.write(buf);
//				fileOutputStream.close();
				FileWriter fileWriter=new FileWriter(file1);
				fileWriter.write(buf);
				fileWriter.close();
				System.out.println(file1.length());
				System.out.println(file1.getAbsolutePath());
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
	}

}

4. 优化代码一对多。

public class Server {

	public static void main(String[] args) {
		
		ServerSocket server=null;
		Socket socket=null;
		try {
			server=new ServerSocket(4331);
		} catch (IOException e) {
			e.printStackTrace();
		}
		 
		 
		 //创建多个客户端
		while(true)
		{
		  try{ 
				
		        socket=server.accept();
		        System.out.println(socket);
		     }
		      catch(IOException e1)
		  {System.out.println("ERRO:"+e1);}

		if(socket!=null)
		{
		    ServerThread thread=new ServerThread(socket);
		    thread.start();	
		}
		
		}
		
		

	}

}





class ServerThread extends Thread
{
	 Socket socket=null;
	 String s=null;
     DataOutputStream out=null;
	 DataInputStream  in=null;
	 
	public ServerThread(Socket socket)
	{
		this.socket=socket;
	}
	
	public void run()
	{  	       
		 try{  
	           in=new DataInputStream(socket.getInputStream());
	           out=new DataOutputStream(socket.getOutputStream());
				
	           while(true)
	           {			
	             s=in.readUTF();// 通过使用in读取客户放入"线路"里的信息。堵塞状态,
	                             //除非读取到信息。
	     	     System.out.println("服务器收到:"+s);
	             out.writeUTF("你说的数是:"+s);

	             Thread.sleep(5000);
	           }
	        }
	     catch(IOException e)
	         {  System.out.println(""+e);
	         }
	       catch(InterruptedException e){}	
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值