作业2 socket通信 版本6
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作业2 socket通信 版本6相关的知识,希望对你有一定的参考价值。
package socket;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
// 客户端
public class Client {
boolean quit = false;//结束聊天
private String ip = "127.0.0.1";// 设置成服务器IP
private int port = 6060;// 设置服务器端口号
// 主函数
public static void main(String arg[]) throws InterruptedException {
// 1、客户端传文件或图片到服务器
// String filepath = ".\\Client\\Client.jpg";
// new Client().ClientToServer(filepath);
// 2、服务器传文件或图片到客户端
new Client().ServerToClient();
// 3、服务器和客户端互聊
new Client().ServerSocketChat();
System.out.println("断开连接,聊天已结束!");
}
// 客户端传送文件或图片给服务器
public void ClientToServer(String filePath) {
try {
Socket socket = new Socket(ip, port);// 客户端socket
// 选择进行传输的文件
File file = new File(filePath);
DataInputStream fin = new DataInputStream(new BufferedInputStream(
new FileInputStream(filePath)));
DataOutputStream fout = new DataOutputStream(
socket.getOutputStream());
// 将文件名传给服务器
fout.writeUTF(file.getName());
fout.flush();
System.out.println("传输文件大小:" + file.length() * 1.0 / 1024 + " KB");
int bufferSize = 8 * 1024;
byte[] buf = new byte[bufferSize];
while (true) {
// System.out.print(file.getName() + "文件正在从客户端传给服务器...\n");
int read = 0;
if (fin != null) {
read = fin.read(buf);
}
if (read == -1) {
break;
}
fout.write(buf, 0, read);// 把buf中的数据写入服务器
}
fout.flush();
fin.close();
// 关闭socket
socket.close();
System.out.println(file.getName() + "文件已从客户端传给服务器,保存在Server文件夹中。");
} catch (Exception e) {
e.printStackTrace();
}
}
// 从服务器端给客户端传文件
public void ServerToClient() {
try {
Socket socket = new Socket(ip, port + 1);
DataInputStream is = new DataInputStream(socket.getInputStream());
OutputStream os = socket.getOutputStream();
// 得到文件名
String filename = ".\\Client\\";
filename += is.readUTF();
System.out.println("新生成的文件路径为:" + filename);
FileOutputStream fos = new FileOutputStream(filename);
byte[] b = new byte[1024];
int length = 0;
// 从socket输入流中读取数据
while ((length = is.read(b)) != -1) {
// 把socket输入流写到文件输出流中去
fos.write(b, 0, length);
}
fos.flush();
fos.close();
is.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 服务器客户端互聊
public void ServerSocketChat() throws InterruptedException {
try {
Socket s = new Socket("localhost", port + 2);
System.out.println("连接成功,可以开始愉快的聊天了,若要结束聊天请按q退出!");
while (true) {
OutputStream out = s.getOutputStream();
Scanner scan = new Scanner(System.in);
String str = scan.next();
String s1 = getDate() + "\t客户端说:" + str;
System.out.println(s1);
out.write(s1.getBytes());
runner1 r = new runner1(s);// 代参构造函数构造
Thread t = new Thread(r);
t.start();
if (quit) {
// out.write("q".getBytes());
t.stop();
return;
}
if ("q".equals(str)) {
out.write("...再见!客户端已结束聊天...".getBytes());
t.sleep(1000);
t.stop();
return;// 结束聊天
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 当前时间
public String getDate() {
// TODO Auto-generated method stub
// 获得data对象
Date nowTime = new Date();
// 创建格式化参数
String pattern = "HH:mm:ss";
// 创建SimpleDateFormat对象
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
// 定义一个变量接收时间
String timePattern = sdf.format(nowTime);
// 返回当前时间
return timePattern;
}
}
// 通过实现 Runnable 接口创建线程
class runner1 implements Runnable {
Socket s;
public runner1(Socket s) {
this.s = s;
}
public void run() {
InputStream is = null;
try {
is = s.getInputStream();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
byte buf[] = new byte[1024];
int len = 0;
while (true) {
try {
len = is.read(buf);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String str1 = new String(buf, 0, len);// 服务器端传来的文字
if ("q".equals(str1)) {
new Client().quit = true;
break;// 结束聊天
}
System.out.println(str1);
}
}
}
package socket;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
//服务器
public class Server {
int port = 6060;// 设置的端口号
boolean quit = false;
public static void main(String arg[]) throws InterruptedException {
// 1、客户端传文件或图片到服务器
// new Server().ClientToServer();
// 2、服务器传文件或图片到客户端
String filepath = ".\\Server\\server.jpg";// 服务器中所传文件的路径
new Server().ServerToClient(filepath);
// 3、服务器客户端互聊
new Server().ServerSocketChat();
System.out.println("断开连接,聊天已结束,若要结束聊天请按q退出!");
}
public void ClientToServer() {// 接受客户端上传的文件,并保存
try {
ServerSocket server = new ServerSocket(port);
System.out.println("服务器已开启");
Socket socket = server.accept();
DataInputStream is = new DataInputStream(socket.getInputStream());
OutputStream os = socket.getOutputStream();
// 得到文件名
String filename = ".\\Server\\";
filename += is.readUTF();
System.out.println("新生成的文件名为:" + filename);
FileOutputStream fos = new FileOutputStream(filename);
byte[] b = new byte[1024];
int length = 0;
while ((length = is.read(b)) != -1) {
// 把socket输入流写到文件输出流中去
fos.write(b, 0, length);
}
fos.flush();
fos.close();
is.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 服务器传送文件或图片给客户端
public void ServerToClient(String filePath) {
// 接受客户端的下载请求,将本地文件传输给客户端
try {
ServerSocket server = new ServerSocket(port + 1);
System.out.println("服务器已开启");
// 选择进行传输的文件
File file = new File(filePath);
Socket socket = server.accept();
System.out.println("建立socket链接");
DataInputStream fin = new DataInputStream(new BufferedInputStream(
new FileInputStream(filePath)));
DataOutputStream fout = new DataOutputStream(
socket.getOutputStream());
// 将文件名传给客户端
fout.writeUTF(file.getName());
// System.out.println(file.getName());
fout.flush();
System.out.println("传输文件大小:" + file.length() * 1.0 / 1024 + " KB");
int bufferSize = 8 * 1024;
byte[] buf = new byte[bufferSize];
while (true) {
// System.out.print(file.getName() + "文件正在从服务器传给客户端...\n");
int read = 0;
if (fin != null) {
read = fin.read(buf);
}
if (read == -1) {
break;
}
fout.write(buf, 0, read);
}
fout.flush();
fin.close();
socket.close();
System.out.println(file.getName() + "文件已从服务器传给客户端,保存在Client文件夹中。");
} catch (Exception e) {
e.printStackTrace();
}
}
// 服务器客户端互聊
public void ServerSocketChat() throws InterruptedException {
try {
ServerSocket ss = new ServerSocket(port + 2);
System.out.println("服务器已开启");
Socket s = ss.accept();
while (true) {
runner2 r = new runner2(s);// 代参构造函数构造
Thread t = new Thread(r);
t.start();
// 服务器写给客户端
OutputStream os = s.getOutputStream();
Scanner scan = new Scanner(System.in);
String str = scan.next();
String s1 = getDate() + "\t服务器说:" + str;
System.out.println(s1);
os.write(s1.getBytes());
if (quit) {
t.stop();
return;
}
if ("q".equals(str)) {
os.write(str.getBytes());
t.sleep(1000);
t.stop();
return;// 结束聊天
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 当前时间
public String getDate() {
// TODO Auto-generated method stub
// 获得data对象
Date nowTime = new Date();
// 创建格式化参数
String pattern = "HH:mm:ss";
// 创建SimpleDateFormat对象
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
// 定义一个变量接收时间
String timePattern = sdf.format(nowTime);
// 返回当前时间
return timePattern;
}
}
// 通过实现 Runnable 接口创建线程
class runner2 implements Runnable {
Socket s;
public runner2(Socket s) {
this.s = s;
}
public void run() {
InputStream in = null;
try {
in = s.getInputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int len = 0;
byte[] buf = new byte[1024];
while (true) {
try {
len = in.read(buf);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String str1 = new String(buf, 0, len);// 服务器端传来的
if ("q".equals(str1)) {
new Server().quit = true;
break;// 结束聊天
}
System.out.println(str1);
}
}
}
以上是关于作业2 socket通信 版本6的主要内容,如果未能解决你的问题,请参考以下文章