私はJavaチャットサーバー&クライアントを持っていますが、うまくいきます。私は別々にクライアントファイル転送プログラムにサーバーを作った、それは正常に動作しています。しかし、私がチャットにファイル転送を統合しようとすると、ファイルが転送されていますが、その間、チャットプログラムはちょうどフリーズし、チャットボックスに何かを入力することさえできず、転送が終わると物事は正常になります。チャットやファイル転送が並んで行われているように、それを正常にする方法、他に影響を受けるものはありませんか?ファイル転送中にjava - chatプログラムがハングしますか?
私のファイル転送にはサーバーとクライアントの両方でループがありますが、whileループのためこのことを知りたいのですが、ファイル転送のサーバーとクライアントコードの両方にスレッドを作成する必要があります。 私のチャットシステムは、サーバー上でユーザーが接続するようなものです。ユーザーからの読み取りのために、そのユーザーのサーバー上でスレッドが開始され、ユーザーからのメッセージがユーザーに送信されます。 クライアントでは、スレッドはサーバーからの読み取り用です。ユーザーがメッセージを入力すると、サーバーに送信され、サーバーに接続されたすべてのユーザーにメッセージが返されます。
私はちょうど私の友人とインターネットでこれをテストしたので、問題はクライアント側であると思います。私は両方のチャットのためにサーバーでした&ファイル転送、私のチャットボックスはうまくいきました。チャットクライアントfreezd時間のファイル転送が行われました。
おかげで、 任意の助けが理解されるWUD ..私はこれを引き起こしているコードのどの部分かわからないので、私は、すぐに誰かがそれを要求するよう、コードでこれを更新します。
[EDIT - クライアント上のファイルの転送]
public class FileClient{
JFrame jfr;
JTextField Jtf = new JTextField(4);
public static void main (String [] args) {
// new FileClient().go();
}
public void go(String ip){
try{
JFrame jfr = new JFrame("File Transfer");
JPanel panel = new JPanel();
JLabel jl = new JLabel("Progress:");
jfr.getContentPane().add(BorderLayout.CENTER,panel);
panel.add(jl);
panel.add(Jtf);
Jtf.setEditable(false);
jfr.setSize(200,70);
jfr.setVisible(true);
jfr.setDefaultCloseOperation(jfr.EXIT_ON_CLOSE);
}catch(Exception e){e.printStackTrace();}
long start = System.currentTimeMillis();
int read;
int totalRead = 0;
try{
Socket sock = new Socket(ip,4243);
System.out.println("Connecting...");
InputStream is = sock.getInputStream();
BufferedInputStream bis = new BufferedInputStream(new ProgressMonitorInputStream(jfr,"reading",is));
byte [] mybytearray = new byte [512];
int buff =1024;
byte[] nameByte = new byte [50];
byte[] nameByteSize = new byte [2];
byte[] Size = new byte [10];
byte[] SizeSize =new byte [1];
int num = is.read(nameByte,0,50);
int nameSize = is.read(nameByteSize,0,2);
int sz = is.read(Size,0,10);
int yy = is.read(SizeSize,0,1);
float w;
String Size1 = RemoveNameStuffing(new String(Size),new String(SizeSize));
int tt = Integer.parseInt(Size1);
System.out.println("tt"+tt);
name"+new String(nameByte));
String name = RemoveNameStuffing(new String(nameByte),new String(nameByteSize));
File f1=new File(name);
FileOutputStream fos = new FileOutputStream(f1);
BufferedOutputStream bos = new BufferedOutputStream(fos);
while ((read = bis.read(mybytearray,0,mybytearray.length)) != -1) {
bos.write(mybytearray, 0 , read);
totalRead += read;
w=((float)totalRead/tt)*100;
System.out.println("progress:"+w+"%");
Jtf.setText(w+"%");
}
bos.flush();
long end = System.currentTimeMillis();
System.out.println(end-start);
bos.close();
sock.close();
}catch(IOException e){e.printStackTrace();}
}
public static String RemoveNameStuffing(String s, String n){
s=s.substring(0,Integer.parseInt(n));
System.out.println("s:"+s);
return s;
}
}
[EDIT - これは私がチャットクライアントにファイル転送コードを呼び出すAM HOW IS]
public class AcceptFileButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
FileCl.go(JTip.getText());
}
}
[編集 - ファイル転送サーバーコード - バッファーサイズ512]
//Waiting for connection
//Sending name in bytes
//While{
send files as bytes
}
public void actionPerformed(ActionEvent e) {
FileSv.go();
}
と私のサーバーでも、すぐにFTサーバーがない場合であっても、私は、ボタンを押すとフリーズ[ABOVE(FTサーバ)CODEが呼び出されたチャットサーバ]接続しても(私はこの援助と思います)。
私はチャットサーバーとクライアントを持っていて、どちらも相互に読み込むスレッドを持っています。私はファイル転送サーバーとクライアントを既存のチャットサーバーとチャットクライアントに統合しようとしました。 最初にユーザーがチャットサーバーに接続すると、チャットサーバーのスレッドが開始されます。そのユーザーにファイルを送信するために、私はサーバー上で1つのボタン(ファイル送信)を作成し、クライアント上では1つ(ファイルを受け入れる)を作成し、サーバー上で「ファイル送信」をクリックすると、ファイル転送サーバーコードが実行され、私が完全にチャットしているユーザーが「ファイルを受け入れる」をクリックすると、Severは別のポートで接続を待つ(私のチャットサーバーがフリーズし、現在は応答しないtextFieldを持つ)。ファイル転送クライアントコードが実行される。 FTサーバはバイトを送信し始め、FTクライアントはそれをrcvsします。サーバーとクライアントの両方のチャットウィンドウは、転送が行われたときに応答しなくなり、転送中にクライアント側のチャットボックスから送信したものは転送後に更新されます。 これは混乱を解消するためです。これが助けにならなくても、私は全体のコード(大きすぎます)をアップロードします
チャットとファイル転送(クライアントまたはサーバー上)の処理と同じスレッドですか? –
あなたのコードを見ることなく、我々はちょうど推測するだろう。 –
チャットと同じスレッドでファイル転送を実行しているようです。複数の同時転送を処理する場合は、ファイル転送用に別のスレッド、またはファイル転送ごとに1つのスレッドが必要になります。 – vaughandroid