java笔记-网络编程-实例操作

上传图片到服务器

import java.io.*;
import java.net.*;
class PicClient 
{
	public static void main(String[] args) throws Exception
	{
		//创建socket服务和连接
		Socket s=new Socket("localhost",10000);
		//确定要操作的文件对象
		FileInputStream fis=new FileInputStream("1.jpg");
		//获得客户端的输出流对象。
		OutputStream os=s.getOutputStream();
		byte[] buf=new byte[1024];
		int len=0;
		//循环将文件对象数据写入到客户端输出流。
		while((len=fis.read(buf))!=-1){
			os.write(buf,0,len);
		}
		//设定输出流结束标识
		s.shutdownOutput();
		
		//获取客户端输入流对象。
		InputStream is=s.getInputStream();
		byte[] bufResult=new byte[1024];

		int lens=0;
		//获取服务端发送到客户端输入流中的数据
		lens=is.read(bufResult);
		System.out.println(new String(bufResult,0,lens));

		fis.close();
		s.close();
	}
}
class PicServer
{
	public static void main(String[] args)throws Exception{
		//建立服务器端服务,监听10000端口
		ServerSocket ss=new ServerSocket(10000);
		//获取连接到服务器的客户端
		Socket s=ss.accept();
		//获取ip并打印。
		String ip=s.getInetAddress().getHostAddress();
		System.out.println(ip+"...connected.");
		//获取输入流对象,取得客户端发送过来的数据。
		InputStream is=s.getInputStream();
		//设定上传文件保存的文件名
		FileOutputStream fos=new FileOutputStream("server.jpg");
		int len=0;
		byte[] buf=new byte[1024];
		//循环读取输入流中的数据并写入到文件输出流。
		while((len=is.read(buf))!=-1){
			fos.write(buf,0,len);
		}
		//上传成功后向客户端反馈信息。
		OutputStream os=s.getOutputStream();
		//将字符串转换为字节并写入到输出流
		os.write("picture upload sucess.".getBytes());
		//关闭资源。
		fos.close();
		s.close();
		ss.close();
	}
}
并发上传图片

需求:

1.允许多个客户端同时上传文件

2.在上传文件前需对文件进行判断(文件后缀,文件大小等...)

import java.io.*;
import java.net.*;
class PicClient 
{
	public static void main(String[] args) throws Exception
	{
		//创建socket服务和连接
		Socket s=new Socket("localhost",10000);
		//参数判断
		if(args.length!=1){
			System.out.println("参数个数不对!");
		}
		File PicFile=new File(args[0]);
		//在对文件操作前需先判断文件是否存在,以及传递过来的是是否为文件。
		if(!(PicFile.exists()&&PicFile.isFile())){
			System.out.println("文件不存在或者不是文件");
		}
		//过滤文件格式
		if(!(PicFile.getName().endsWith(".jpg"))){
			System.out.println("不是jpg格式的文件");
		}
		//过滤文件大小。
		if(PicFile.length()>1024*1024*4){
			System.out.println("文件太大。");
		}
		//确定要操作的文件对象
		FileInputStream fis=new FileInputStream(PicFile);
		//获得客户端的输出流对象。
		OutputStream os=s.getOutputStream();
		byte[] buf=new byte[1024];
		int len=0;
		//循环将文件对象数据写入到客户端输出流。
		while((len=fis.read(buf))!=-1){
			os.write(buf,0,len);
		}
		//设定输出流结束标识
		s.shutdownOutput();
		
		//获取客户端输入流对象。
		InputStream is=s.getInputStream();
		byte[] bufResult=new byte[1024];

		int lens=0;
		//获取服务端发送到客户端输入流中的数据
		lens=is.read(bufResult);
		System.out.println(new String(bufResult,0,lens));

		fis.close();
		s.close();
	}
}
class PicServer
{
	public static void main(String[] args)throws Exception{
		//建立服务器端服务,监听10000端口
		ServerSocket ss=new ServerSocket(10000);
		//获取连接到服务器的客户端
		while(true){
			Socket s=ss.accept();
			new Thread(new PicThread(s)).start();
		}
	}
}
class PicThread implements Runnable
{
	private Socket s;
	//输出文件名
	private File picFile;
	PicThread(Socket s){
		this.s=s;
	}
	public void run(){
		int PicCount=1;
		
		try{
			//获取ip并打印。
			String ip=s.getInetAddress().getHostAddress();
			System.out.println(ip+"...connected.");
			//获取输入流对象,取得客户端发送过来的数据。
			InputStream is=s.getInputStream();
			//设定上传文件保存的文件名
			picFile=new File(ip+"("+PicCount+").jpg");
			//循环判断,如果文件名已经存在,则PicCount加1
			while(picFile.exists()){
				picFile=new File(ip+"("+(PicCount++)+").jpg");
			}
			FileOutputStream fos=new FileOutputStream(picFile);
			int len=0;
			byte[] buf=new byte[1024];
			//循环读取输入流中的数据并写入到文件输出流。
			while((len=is.read(buf))!=-1){
				fos.write(buf,0,len);
			}
			//上传成功后向客户端反馈信息。
			OutputStream os=s.getOutputStream();
			//将字符串转换为字节并写入到输出流
			os.write("picture upload sucess.".getBytes());
			//关闭资源。
			fos.close();
			s.close();
		}
		catch(Exception e){
			throw new RuntimeException("uplaod error.");
		}
	}
}

用户登录

/*
** 需求,客户端登录服务器
** 1.客户端从键盘输入用户名,然后发送到服务器验证,若验证成功,客户端打印“欢迎...”
**   服务器端打印用户已经登录;若验证失败,客户端打印没有该用户,服务器端打印用户尝试登录
** 2.客户端只有三次的机会尝试登录服务器。
*/
import java.io.*;
import java.net.*;

/*
** 客户端
*/
class LoginClient
{
	public static void main(String[] args) throws Exception
	{
		//建立socket服务,并连接主机及端口10003
		Socket s=new Socket("localhost",10003);
		/*
		** 客户端获取用户名
		*/
		//建立缓存,读取键盘输入。
		BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
		//打印客户端输出流中的信息,并自动刷新。
		PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
		//读取客户端输入流中的信息。
		BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
		//存储键盘输入的行信息。
		String line=null;
		//行长度
		int len=0;
		//允许输入三次。
		for(int x=0;x<3;x++){
			//获取行数据。
			line=bufr.readLine();
			//在对行数据操作前先判断行数据是否为空,若为空则直接退出。
			if(line==null)
				break;
			//将获取的行数据(用户名)发送到服务器。
			pw.println(line);
			/*
			** 获取服务器发送到客户端的消息。
			*/
			String str=bufIn.readLine();
			//若服务器发送的消息中含有“欢迎”则表示登录成功。
			if(str.contains("欢迎")){
				System.out.println(str);
				break;
			}
			else{
				System.out.println("用户名不存在");
			}
		}
		//关闭资源。
		bufr.close();
		s.close();
	}
}
/*
** 服务器
*/
class LoginServer
{
	public static void main(String[] args)throws Exception{
		//建立serverSocket服务,并监听端口10003
		ServerSocket ss=new ServerSocket(10003);
		//建立循环,允许多个客户端同时登录
		while(true){
			//获取连接到服务器的客户端。
			Socket s=ss.accept();
			//为每一个连接到服务器的客户端建立线程,并启动。
			new Thread(new UserLogin(s)).start();
		}
	}
}
class UserLogin implements Runnable
{
	private Socket s;
	UserLogin(Socket s){
		this.s=s;
	}
	public void run(){
		//获取ip地址,以判断是否连接。
		String ip=s.getInetAddress().getHostAddress();
		System.out.println(ip+"...connected.");
		try{
			//服务端只接收3次客户端发送过来的消息。
			for(int x=0;x<3;x++){
				//获取用户数据对象。
				BufferedReader bufr=new BufferedReader(new FileReader("user.txt"));
				//获取服务端输入流信息。
				BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
				PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
				String userName=null;
				String str=null;
				boolean flag=false;
				//从输入端获取行数据(用户名)
				userName=bufIn.readLine();
				//在对用户名操作前先判断用户名是否有效。
				if(userName==null){
					break;
				}
				//判断用户名是否在用户数据库中。
				while((str=bufr.readLine())!=null){
					//如果存在则将标识置位
					if(userName.equals(str)){
						//表示获得用户信息。
						flag=true;
						break;
					}
				}
				if(flag){
					//将如下消息发送到客户端。
					pw.println(userName+":欢迎您");
					//如下信息将在客户端显示。
					System.out.println(ip+":"+userName+":已经登录");
					//一旦该客户端登录成功则退出登录界面。
					break;
				}
				else{
					pw.println(userName+"不存在");
					System.out.println(ip+":"+userName+":尝试登录");
				}
			}
			s.close();
		}
		catch(Exception e){
			//e.toString()可有效反馈出错信息。
			throw new RuntimeException(e.toString());
		}
	}
}
出错信息中直接打印e.toString()可直接获取出错的详细信息。用户判断只能三次,一旦判断成功则将登录成功标识位置位。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值