//サーバークラス
class Server{
//ファイル用ソケット作成(インナークラス)
class FileHandler extends Thread{
Socket incoming;
String filename;
FileHandler(Socket i,String s){
incoming=i;
filename=s;
}
public void run(){
try{
//ファイルをクライアントに転送
FileInputStream in=new FileInputStream(filename);
byte[] buff=new byte[4096];
int len;
while(true){
len=in.read(buff,0,4096);
incoming.getOutputStream().write(buff,0,len);
if(len<4096){
break;
}
}
in.close(); incoming.close();
}catch(IOException e){}
}
}
//Stringデータ用ソケット作成(インナークラス)
class MessageHandler extends Thread{
Socket incoming;
String filename;
MessageHandler(Socket i){
incoming=i;
}
public void run(){
try{
PrintWriter message=new PrintWriter(incoming.getOutputStream(),true);
BufferedReader request=new BufferedReader(new InputStreamReader(incoming.getInputStream()));
while(true){
String inputline=request.readLine();
if(inputline!=null){
if(inputline.equals("bye")){ break; }
filename=inputline;
}
}
message.close(); request.close(); incoming.close();
}catch(IOException e){}
}
}
//個々のクライアント管理用クラス(インナークラス)
class Cell{
Cell next;
String address;
MessageHandler mh;
Cell(String s){
next=null;
address=s;
}
String getAddress(){
if(mh.isAlive()){
address=mh.incoming.getInetAddress().toString();
return address;
}
else{
address="kara";
return address;
}
}
void runMessageHandler(Socket incoming){
mh=new MessageHandler(incoming);
mh.start();
}
void runFileHandler(Socket incoming){
new FileHandler(incoming, mh.filename).start();
}
}
// 循環リスト(インナークラス)
class CircularList{
Cell header;
int length;
CircularList(){
header=new Cell("**List Head**");
length=0;
}
void add(Cell x){
getCell(length).next=x;
x.next=header;
length++;
}
void remove(int n){
getCell(n-1).next=getCell(n+1);
length--;
}
Cell getCell(int n){
Cell p=header;
for(int i=0; i<n; i++){
p=p.next;
}
return p;
}
}
//Serverの記述開始
int port;
CircularList list=new CircularList();
void run(){
try{
ServerSocket server=new ServerSocket(port);
loop:
while(true){
Socket incoming=server.accept();
//アクセスが現在接続中のクライアントによるものか、新規クライアントによるものかどうか判断
for(int i=1; i<list.length; i++){
if(list.getCell(i).getAddress().equals(incoming.getInetAddress().toString())){
list.getCell(i).runFileHandler(incoming);
continue loop;
}
else if(list.getCell(i).address.equals("kara")){
list.remove(i);
}
}
list.add(new Cell(incoming.getInetAddress().toString()));
list.getCell(list.length).runMessageHandler(incoming);
}
}catch(Exception e){}
}
}
//クライアントクラス
class Client{
//ファイル受信用クラス(インナークラス)
class FileReciever extends Thread{
String host;
int port;
String filename;
FileReciever(String aHost, int aPort,String file){
host=aHost;
port=aPort;
filename=file;
}
public void run(){
try{
Socket socket=new Socket(host,port);
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
pw.println(filename);
//サーバーからのデータ受信
FileOutputStream out=new FileOutputStream(filename);
byte[] buff=new byte[4096];
int len;
while(true){
len=socket.getInputStream().read(buff,0,4096);
out.write(buff,0,len);
if(len<4096){
break;
}
}
out.close(); socket.close();
}catch(IOException e){}
}
}
//Clientの記述開始
String host;
int port;
String filename;
void run(){
try{
Socket socket=new Socket(host,port);
//キーボードからの入力(サーバーへの回答用)
BufferedReader infK=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true){
filename=infK.readLine();
if(filename!=null){
if(filename.equals("bye")){
pw.println("bye");
break;
}
pw.println(filename);
new FileReciever(host,port,filename).start();
}
}
br.close(); infK.close(); pw.close(); socket.close();
}catch(IOException e){}
}
}
|