因为没有用while循环,所以只能监听一个客户端,此程序主要是把两者整合起来,使得用户可以选择。
先传上来,以后用的时候直接下载copy,到时候改改while的位置就能实现监听多个客户端。
client
pa
ckage client;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
public class Client {
private static String ServerIpAddress = "127.0.0.1";// 对方的IP
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) throws IOException {
String words = "Hello";// 对方的话
String temp = null;
while(true){
System.out.println("*******选择操作:**********");
System.out.println("*******1对话:************");
System.out.println("*******2传输文件***********");
System.out.println("*******3退出系统***********");
System.out.println("************************");
Socket s = null;
OutputStream outputstream = null;
InputStream inputstream = null;
byte[] serverSay = new byte[1000];// 读取<1KB
int len;
int t=sc.nextInt();
if(t==1){
//如果t等于1,那么就会是说客户端与服务器之间进行对话交流。就通过给服务器一个word标记,让服务器识别,然后进行对话的操作。
String flag="word";
//socket连接服务器,地址是默认的本地,端口号自定义,与服务器一致就好。
s = new Socket(InetAddress.getByName(ServerIpAddress), 9527);// 套接字的IP地址和端口号
//获取输出流,也就是输出到服务器的内容
outputstream = s.getOutputStream();
outputstream.write(flag.getBytes("gbk"));// 向服务器发送消息
System.out.println("已向服务器发送对话请求。现在接收服务器消息");
//获取输入流,获得服务器传过来的数据
inputstream = s.getInputStream();
len = inputstream.read(serverSay);// 接受服务器消息
if(new String(serverSay, 0, len).equals("beginword"))
sendword();//当sendword输入quit时,就会返回到这,然后因为while而实现死循环
t=3;
}
else if(t==2){
String flag="file";
//socket连接服务器,地址是默认的本地,端口号自定义,与服务器一致就好。
s = new Socket(InetAddress.getByName(ServerIpAddress), 9527);// 套接字的IP地址和端口号
//获取输出流,也就是输出到服务器的内容
outputstream = s.getOutputStream();
outputstream.write(flag.getBytes("gbk"));// 向服务器发送消息
System.out.println("已向服务器发送文件请求。现在接收服务器消息");
//获取输入流,获得服务器传过来的数据
inputstream = s.getInputStream();
len = inputstream.read(serverSay);// 接受服务器消息
if(new String(serverSay, 0, len).equals("beginfile")){
//当sendword输入quit时,就会返回到这,然后因为while而实现死循环
sendfile();
}
t=3;
}
if(t==3){
outputstream.close();
inputstream.close();
s.close();
break;
}
}
System.out.println("退出系统成功 !");
}
//传输文件
private static void sendfile() {
System.out.println("开始传输文件");
int length = 0;
byte[] sendBytes = null;
Socket socket = null;
DataOutputStream dos = null;
FileInputStream fis = null;
OutputStream outputstream = null;
while(true){
try {
try {
Scanner sc=new Scanner(System.in);
System.out.println("请输入地址:(equit表示退出)");
String s=sc.next();
if(s.equals("quit")){
break;
}
socket = new Socket(InetAddress.getByName(ServerIpAddress), 9527);// 套接字的IP地址和端口号
outputstream = socket.getOutputStream();
outputstream.write(s.getBytes("gbk"));// 向服务器发送消息
dos = new DataOutputStream(socket.getOutputStream());
File file = new File(s);
fis = new FileInputStream(file);
sendBytes = new byte[1024];
while ((length = fis.read(sendBytes, 0, sendBytes.length)) > 0) {
dos.write(sendBytes, 0, length);
dos.flush();
}
} finally {
if (dos != null)
dos.close();
if (fis != null)
fis.close();
if (socket != null)
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//传输字符,与客户端进行交流
public static void sendword() throws IOException{
byte[] serverSay = new byte[1000];// 读取<1KB
Socket s = null;
InputStreamReader read = null;
OutputStream outputstream = null;
InputStream inputstream = null;
String temp = null;
int len;
String words = "Hello";// 对方的话
// 取得你各他的Message
System.out.println("请输入想对他(她)说的话----输入QUIT 退出!!:");
//输入
read = new InputStreamReader(System.in);
while (true) {
try {
temp = "Hello";
temp = new BufferedReader(read).readLine();
words = temp;
int flag=1;
temp = "客户端....." + words;
if (words.equals("quit")) {
flag=0;
temp=words;
}
// 发起通信
s = new Socket(InetAddress.getByName(ServerIpAddress), 9527);// 套接字的IP地址和端口号
//是输出与输入获取到socket的值,也就是与服务器之间的交流
outputstream = s.getOutputStream();
inputstream = s.getInputStream();
outputstream.write(temp.getBytes("gbk"));// 向服务器发送消息
if(flag==0){
break;
}
len = inputstream.read(serverSay);// 接受服务器消息
System.out.println( new String(serverSay, 0, len));// 客户端控制台显示服务器返回的信息
} catch (Exception e) {
} finally {
inputstream.close();
outputstream.close();
s.close();// 记住一定要关闭这些输入,输出流和套接字
}
}// end while
}
}
服务器端
分三个类,一个server,是总的类,在其中根据用户不同的操作,调用了不同的类,如果用户选择了对话,就调用socketwordListener类,如果选择了文件上传,就调用ServerFileListener类
上代码:
server.java
/*
* 服务器总类,负责监听客户端先发来的消息,可以是对话或者发送文件,然后进入不同的类进行操作。socket的accept监听是在调用的类里实现的。
* */
package server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
static Socket socket = null;
static ServerSocket serversocket;
public static void main(String args[]) throws IOException {
OutputStream outputstream = null;
InputStream inputstream = null;
byte[] rece = new byte[1000];
String reces=null;
serversocket = new ServerSocket(9527); // 服务器的套接字,端口为9527
socket = serversocket.accept(); //监听客户端
inputstream = socket.getInputStream();
outputstream = socket.getOutputStream();// 得到输出流
int len;
len = inputstream.read(rece);// 接受客户端消息
if (len != 0)
reces = new String(rece, 0, len);
//如果客户端给的是word,就代表是对话请求,
if(reces.equals("word")){
//返回可以开始对话
String s="beginword";
System.out.println("输出给客户端一个beginword");
outputstream.write(s.getBytes());// 返回给客户端的欢迎信息
socketwordListener swl=new socketwordListener(serversocket);
swl.sta();
}else if(reces.equals("file")){
//文件操作
String s="beginfile";
System.out.println("输出给客户端一个beginfile");
outputstream.write(s.getBytes());
//直接调用监控类,在监控类里进行传输操作。。。。防止出现乱码
ServerFileListener stp=new ServerFileListener(serversocket);
stp.sta();
}
else{
//结束操作
String s="end";
System.out.println("输出给客户端一个end");
outputstream.write(s.getBytes());
}
outputstream.close();
inputstream.close();
socket.close();
}
} socketwordListener类
/*
* 对话操作
* */
package server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class socketwordListener extends Thread{
ServerSocket server ;
static int flag=1;
public socketwordListener(ServerSocket socket){
this.server=socket;
}
//调用这个函数进行监控,新建一个线程去操作相应的事情
public void sta() throws IOException {
try {
Thread th = new Thread(new Runnable() {
public void run() {
while (true) {
try {
Socket socket;
//监听客户端发来的消息,在新线程里操作,
if(flag==1){
socket = server.accept();
//监听有客户端连接,进入对话操作。
wordtodo(socket);
}
} catch (Exception e) {
}
}
}
});
th.run(); //启动线程运行
} catch (Exception e) {
e.printStackTrace();
}
}
public void run(){
}
//对话操作
public static void wordtodo(Socket socket){
OutputStream outputstream = null;
InputStream inputstream = null;
byte[] rece = new byte[1000];
String reces=null;
try {
inputstream = socket.getInputStream();
outputstream = socket.getOutputStream();// 得到输出流
int len;
len = inputstream.read(rece);// 接受客户端消息
if (len != 0)
reces = new String(rece, 0, len);
if(reces.equals("quit")){
System.out.println("客户端退出!");
flag=0;
}
System.out.println(reces);
//输入要发送给客户端的值
BufferedReader bufferreader = new BufferedReader(new InputStreamReader(System.in));
outputstream.write(("服务器....."+bufferreader.readLine()).getBytes());// 返回给客户端的欢迎信息
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 得到输入流
finally{
if(socket!=null)
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
socket=null;
e.printStackTrace();
}
}
}
}
socketFileListener类
/*
* 文件操作类
* */
package server;
import java.net.*;
import java.io.*;
public class ServerFileListener implements Runnable {
ServerSocket server ;
public ServerFileListener( ServerSocket server){
this.server=server;
}
//文件操作的socket监听
public void sta() throws IOException {
try {
Thread th = new Thread(new Runnable() {
public void run() {
while (true) {
try {
System.out.println("开始监听...");
Socket socket = server.accept();
//有客户端连接,进入相应操作
receiveFile(socket);
} catch (Exception e) {
}
}
}
});
th.run(); //启动线程运行
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
}
//文件操作
public static void receiveFile(Socket socket) {
byte[] inputByte = null;
byte[] serverSay = new byte[1000];// 读取<1KB
int length = 0;
DataInputStream dis = null;
FileOutputStream fos = null;
InputStream inputstream = null;
try {
try {
inputstream = socket.getInputStream();
int len = inputstream.read(serverSay);// 接受服务器消息
System.out.println( new String(serverSay, 0, len));// 客户端控制台显示服务器返回的信息
String filename=new String(serverSay,0,len);
String[] sa=filename.split("\\/");
//输出文件的名字
System.out.println("__________________________"+sa[sa.length-1]);
//构造要存储的路径,该路径是项目文件夹下,其中。/代表该项目下。然后获取的加了一个文件名
String newname="./"+sa[sa.length-1];
dis = new DataInputStream(socket.getInputStream());
System.out.println("+++++++++++++++++");
fos = new FileOutputStream(new File(newname));
inputByte = new byte[1024];
System.out.println("开始接收数据...");
while ((length = dis.read(inputByte, 0, inputByte.length)) > 0) {
System.out.println(length);
fos.write(inputByte, 0, length);
fos.flush();
}
System.out.println("完成接收");
} finally {
if (fos != null)
fos.close();
if (dis != null)
dis.close();
if (socket != null)
socket.close();
}
} catch (Exception e) {
}
}
}