第一次洗博客,纯属自己纪念,主要来源是慕课网的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();
}
}
}