利用Socket实现多客户端传输对象和传输文件实现

第一次洗博客,纯属自己纪念,主要来源是慕课网的Socket通信课程,实现课后任务多客户端传输对象,自己遇到的最大问题是忘记给User类实现序列化接口。
客户端实现:
package com.imooc.test;

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

public class Client {

	public static void main(String[] args) {
		try {
			Socket socket=new Socket("localhost",8888);
			OutputStream os=socket.getOutputStream();
			ObjectOutputStream oos=new ObjectOutputStream(os);//将字节流变成对象流,程序到这里还没码完
			User user=new User("tom","123");
			oos.writeObject(user);//序列化,User类需要实现序列化接口
//			oos.flush();
			/*
			 * 将字节流包装成print流
			 */
//			PrintWriter pw=new PrintWriter(os);
//			pw.write("用户名:tom;密码:456");
//			pw.flush();
			socket.shutdownOutput();
			//创建输入流,接受来自服务器的信息
			InputStream is=socket.getInputStream();
			InputStreamReader isr=new InputStreamReader(is);
			BufferedReader br=new BufferedReader(isr);
			String info=null;
			while((info=br.readLine())!=null){
				System.out.println("我是客户端,服务器发回复消息:"+info);
			}
			//关闭资源
			br.close();
			isr.close();
			is.close();
			oos.close();
//			pw.close();
			os.close();
			socket.close();
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

服务器实现:

package com.imooc.test;

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.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * 基于tcp协议的Socket通信
 * 服务器端
 */
public class Server {

	public static void main(String[] args) {
		try {
			//1.创建服务器端ServerSocket对象,并指定侦听端口
			ServerSocket serverSocket=new ServerSocket(8888);
			System.out.println("***服务器即将启动,等待客户端发送请求***");
			int count=0;//统计客户端数量
			while(true){
				//2.开始侦听指定端口,接收到之后创建Socket对象
				Socket socket=serverSocket.accept();
				count++;
				
				ServerThread serverThread=new ServerThread(socket);
				serverThread.start();
				System.out.println("客户端数量:"+count);
				InetAddress address=socket.getInetAddress();
				System.out.println("客户端IP地址:"+address.getHostAddress());
				
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
服务器线程实现:

package com.imooc.test;

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

import javax.print.attribute.standard.MediaSize.ISO;

/*
 * 服务器端线程处理
 */
public class ServerThread extends Thread{
	
	public Socket socket;
	public ServerThread(Socket socket){
		this.socket=socket;
	}
	
	public void run(){
		InputStream is=null;
		InputStreamReader isr=null;
		BufferedReader br=null;
		OutputStream os=null;
		PrintWriter pw=null;
		ObjectInputStream ois=null;
		try {
			//3.通过getInputStream方法,接收来自客户端的输入流
			/*
			 * 从客户端接受对象类型数据
			 */
			is=socket.getInputStream();
			ois=new ObjectInputStream(is);
			User user=(User) ois.readObject();//读取对象数据的方法
			System.out.println("我是服务器,客户端发来消息:"+"用户名:"+user.getUsername()+";密码:"+user.getPassword());
			/*
			 * 从客户端接受字符串数据
			 */
//			isr=new InputStreamReader(is);
//			br=new BufferedReader(isr);
//			String info=null;
//			while((info=br.readLine())!=null){
//				System.out.println("我是服务器,客户端发来消息:"+info);
//			}
			//4.创建输出流,准备输出信息给客户端
			os=socket.getOutputStream();
			pw=new PrintWriter(os);
			pw.write("欢迎您");
			pw.flush();
			
			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				socket.shutdownInput();
				//关闭其他资源
				if(pw!=null){
					pw.close();
				}
				if(os!=null){
					os.close();
				}
//				br.close();
//				isr.close();
				if(ois!=null){
					ois.close();
				}
				if(is!=null){
					is.close();
				}
				if(socket!=null){
					socket.close();
				}
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
User类实现:

package com.imooc.test;

import java.io.Serializable;

public class User implements Serializable{
	private String username;
	private String password;

	public User(String username, String password) {
		this.username = username;
		this.password = password;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}

最后在原程序的基础上,稍加修改,实现文件传送。修改的部分仅服务器线程类和客户端类

服务器线程实现,我在D盘的FIle文件下新建了一个Server.txt文件

package com.imooc.test1;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

import javax.print.attribute.standard.MediaSize.ISO;

/*
 * 服务器端线程处理
 */
public class ServerThread extends Thread{
	
	public Socket socket;
	public ServerThread(Socket socket){
		this.socket=socket;
	}
	
	public void run(){
		InputStream is=null;
		InputStreamReader isr=null;
		BufferedReader br=null;
		OutputStream os=null;
		PrintWriter pw=null;
		ObjectInputStream ois=null;
		try {
			//3.通过getInputStream方法,接收来自客户端的输入流
			/*
			 * 从客户端接受对象类型数据
			 */
			is=socket.getInputStream();
			ois=new ObjectInputStream(is);
			User user=(User) ois.readObject();//读取对象数据的方法
			System.out.println("我是服务器,客户端发来消息:"+"用户名:"+user.getUsername()+";密码:"+user.getPassword());
			/*
			 * 从客户端接受字符串数据
			 */
//			isr=new InputStreamReader(is);
//			br=new BufferedReader(isr);
//			String info=null;
//			while((info=br.readLine())!=null){
//				System.out.println("我是服务器,客户端发来消息:"+info);
//			}
			//4.创建输出流,准备输出文件给客户端
			os=socket.getOutputStream();
			/*
			 * 这就是将输出流包装成对象输出流的方式来输出文件
			  	ObjectOutputStream obj=new ObjectOutputStream(os);
			 * 
			 */
			 //这里是将字节输出流包装成缓冲输出流来输出文件
			   BufferedOutputStream obj=new BufferedOutputStream(os);
				File file=new File("D:"+File.separator+"File"+File.separator+"Server.txt");
				FileInputStream fis=new FileInputStream(file);
				byte[] sendByte=new byte[1024];
				int length;
				while((length=fis.read(sendByte,0,sendByte.length))!=-1){
				obj.write(sendByte,0,length);
				obj.flush();
			}
			 
			
			
			
			
			
			
//			pw=new PrintWriter(os);
//			pw.write("欢迎您");
//			pw.flush();
			
			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				socket.shutdownInput();
				//关闭其他资源
				if(pw!=null){
					pw.close();
				}
				if(os!=null){
					os.close();
				}
//				br.close();
//				isr.close();
				if(ois!=null){
					ois.close();
				}
				if(is!=null){
					is.close();
				}
				if(socket!=null){
					socket.close();
				}
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
客户端实现:

package com.imooc.test1;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {

	public static void main(String[] args) {
		try {
			Socket socket=new Socket("localhost",8888);
			OutputStream os=socket.getOutputStream();
			ObjectOutputStream oos=new ObjectOutputStream(os);//将字节流变成对象流,程序到这里还没码完
			User user=new User("tom","123");
			oos.writeObject(user);//序列化,User类需要实现序列化接口
//			oos.flush();
			/*
			 * 将字节流包装成print流
			 */
//			PrintWriter pw=new PrintWriter(os);
//			pw.write("用户名:tom;密码:456");
//			pw.flush();
			socket.shutdownOutput();
			//创建输入流,接受来自服务器的信息
			InputStream is=socket.getInputStream();
//			ObjectInputStream ois=new ObjectInputStream(is);  
			BufferedInputStream ois=new BufferedInputStream(is);
			File file=new File("D:"+File.separator+"File"+File.separator+"Client.txt");
			FileOutputStream fos=new FileOutputStream(file);
			byte[] buf=new byte[1024];
			int length;
			//ObjectInputStream的read方法,将数据写入buf,从0开始读,最大读取的长度为缓冲数组的长度。返回的为读取字节数的实际长度,到达末尾时返回-1
			while((length=ois.read(buf, 0, buf.length))!=-1){
				fos.write(buf, 0, length);
				fos.flush();
				System.out.println("客户端这个时候正在接收数据");
			}
			
			
//			InputStreamReader isr=new InputStreamReader(is);
//			BufferedReader br=new BufferedReader(isr);
//			String info=null;
//			while((info=br.readLine())!=null){
//				System.out.println("我是客户端,服务器发回复消息:"+info);
//			}
			//关闭资源
			fos.close();
			ois.close();
//			br.close();
//			isr.close();
			is.close();
			oos.close();
//			pw.close();
			os.close();
			socket.close();
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}




  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值