如何實(shí)現(xiàn)java客戶端循環(huán)接收服務(wù)器信息呢
想寫一個(gè)簡(jiǎn)單的聊天程序,但是每次客戶端只能接收服務(wù)器的第一條消息就無(wú)法接收了,找了一天也沒(méi)找出問(wèn)題,只能求助了,上代碼。
-----------------Server類--------------------
package com.WindFamilyRain6;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server {
static List<Socket> client=new ArrayList<Socket>();
static boolean keepRunning=true;
static int count=0;
?public static void main(String[] args) {
??// TODO Auto-generated method stub
try {
?
?ServerSocket serversocket=new ServerSocket(30000);? //創(chuàng)建服務(wù)器socket
?System.out.println("------------服務(wù)器已經(jīng)啟動(dòng),等待客戶端連接----------");? //輸出信息,表示建立成功
?/*
? * 持續(xù)監(jiān)聽(tīng)客戶端連接
? * 并輸出已連接的客戶端
? * 的相關(guān)信息
? */
?while(keepRunning){
?Socket socket=serversocket.accept();//接收客戶端socket
?System.out.println("--------------已連接至一臺(tái)客戶端-----------------");
?client.add(socket);??? //將其添加進(jìn)client的List中
?System.out.println(client.get(count).toString());
?//啟動(dòng)此客戶端的線程
?ServerThread serverthread=new ServerThread(socket);
?serverthread.setPriority(4);//設(shè)置優(yōu)先級(jí)
?serverthread.start();
?count++;
?System.out.println("客戶端數(shù)量:"+count);
?//獲取客戶端主機(jī)信息
?InetAddress address=socket.getInetAddress();
?System.out.println("客戶端的主機(jī)名稱為:"+address.getHostName());
?System.out.println("客戶端的地址為:"+address.getHostAddress());
?}
?serversocket.close();
} catch (IOException e) {
?// TODO Auto-generated catch block
?e.printStackTrace();
}
?
}
}
---------------ServerThread類------------
package com.WindFamilyRain6;
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.Socket;
public class ServerThread extends Thread {
Socket socket;
OutputStream os;
PrintWriter pw;
InputStream is;
BufferedReader br;
String MassageByReceive="dsa";
?public ServerThread(Socket socket){
?this.socket=socket;
}
?public void run(){
?try {
??os=socket.getOutputStream();//獲取客戶端輸出流
??os.write("連接成功......\n".getBytes());//輸出信息以提示已連接至服務(wù)器
??os.write("操你來(lái)來(lái)".getBytes());
??os.flush();
??is=socket.getInputStream();//獲取客戶端輸入流
??br=new BufferedReader(new InputStreamReader(is));//包裝為字符流并添加緩沖
??while(true){
???System.out.println(br.ready());
???MassageByReceive=br.readLine();?//讀取客戶端信息并保存至字符串
???//for each遍歷list中所有客戶端,并轉(zhuǎn)發(fā)消息至所有客戶端
???for (Socket client : Server.client) {
????os=client.getOutputStream();//獲取輸出流
????pw=new PrintWriter(os);//包裝為打印流
????pw.write(MassageByReceive);//發(fā)送消息至客戶端
????pw.flush();//刷新緩沖
????System.out.println(MassageByReceive);
???}
???sleep(100);
??}
?} catch (IOException e) {
??// TODO Auto-generated catch block
??e.printStackTrace();
?} catch (InterruptedException e) {
??// TODO Auto-generated catch block
??e.printStackTrace();
?}
?
?}
}
--------------clientFrame類---------------
package com.WindFamilyRain6;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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.Socket;
import java.net.UnknownHostException;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.border.EmptyBorder;
public class ClientFrame extends JFrame {
private String name="小紅";
?private JPanel contentPane;
?private JTextField text_name;
?private JTextField textField;
?static Socket socket;
? protected static JTextArea textArea_chatArea;
??InputStream is;
?BufferedReader br;
?OutputStream os;
?PrintWriter pw;
?String MassageForSend;
/**
?* receiveMassage方法用于接收服務(wù)器傳來(lái)的消息
?* 并打印至聊天框中
?*/
?
?
?public static void main(String[] args) {
??
??EventQueue.invokeLater(new Runnable() {
???public void run() {
????try {
?????ClientFrame frame = new ClientFrame();
?????frame.setVisible(true);
????} catch (Exception e) {
?????e.printStackTrace();
????}
???}
??});?
??try {
???socket=new Socket("192.168.1.102",30000);//創(chuàng)建客戶端socket
???
??} catch (UnknownHostException e) {
???// TODO Auto-generated catch block
???e.printStackTrace();
??} catch (IOException e) {
???// TODO Auto-generated catch block
???e.printStackTrace();
??}
??ClientThread clientthread=new ClientThread(socket);
??clientthread.start();
?}
?/**
? * Create the frame.
? */
?public ClientFrame() {
?
??setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
??setBounds(100, 100, 450, 300);
??contentPane = new JPanel();
??contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
??setContentPane(contentPane);
??
??JLabel label = new JLabel("\u6635\u79F0\uFF1A");
??label.setFont(new Font("華文楷體", Font.PLAIN, 17));
??
??text_name = new JTextField();
??text_name.setBackground(Color.WHITE);
??text_name.setForeground(Color.BLACK);
??text_name.setEditable(false);
??text_name.setColumns(10);
??text_name.setText(name);
??
??textArea_chatArea = new JTextArea();
??
??JLabel lblNewLabel = new JLabel("\u8BF7\u8F93\u5165\u804A\u5929\u5185\u5BB9\uFF1A");
??lblNewLabel.setFont(new Font("華文楷體", Font.PLAIN, 19));
??
??textField = new JTextField();
??textField.setColumns(10);
??
??JButton Button_send = new JButton("\u53D1\u9001");
??//添加按鈕響應(yīng)事件用于發(fā)送消息至客戶端
??Button_send.addActionListener(new ActionListener() {
???public void actionPerformed(ActionEvent arg0) {
????try {
?????os=socket.getOutputStream();//獲取輸出流
?????pw=new PrintWriter(os);//包裝為打印流
?????MassageForSend=name+":"+textField.getText()+"\n";? //保存客戶端消息至字符串
?????pw.write(MassageForSend);//發(fā)送消息至客戶端
?????pw.flush();//刷新緩沖
?????textField.setText("");
????} catch (IOException e) {
?????// TODO Auto-generated catch block
?????e.printStackTrace();
????}
????
???}
??});
??GroupLayout gl_contentPane = new GroupLayout(contentPane);
??gl_contentPane.setHorizontalGroup(
???gl_contentPane.createParallelGroup(Alignment.LEADING)
????.addGroup(gl_contentPane.createSequentialGroup()
?????.addGap(41)
?????.addComponent(label, GroupLayout.PREFERRED_SIZE, 61, GroupLayout.PREFERRED_SIZE)
?????.addPreferredGap(ComponentPlacement.RELATED)
?????.addComponent(text_name, GroupLayout.PREFERRED_SIZE, 146, GroupLayout.PREFERRED_SIZE)
?????.addContainerGap(220, Short.MAX_VALUE))
????.addComponent(textArea_chatArea, GroupLayout.DEFAULT_SIZE, 474, Short.MAX_VALUE)
????.addGroup(gl_contentPane.createSequentialGroup()
?????.addComponent(lblNewLabel)
?????.addPreferredGap(ComponentPlacement.RELATED)
?????.addComponent(textField, GroupLayout.PREFERRED_SIZE, 181, GroupLayout.PREFERRED_SIZE)
?????.addPreferredGap(ComponentPlacement.RELATED)
?????.addComponent(Button_send, GroupLayout.PREFERRED_SIZE, 70, GroupLayout.PREFERRED_SIZE)
?????.addGap(57))
??);
??gl_contentPane.setVerticalGroup(
???gl_contentPane.createParallelGroup(Alignment.LEADING)
????.addGroup(gl_contentPane.createSequentialGroup()
?????.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
??????.addComponent(label, GroupLayout.PREFERRED_SIZE, 28, GroupLayout.PREFERRED_SIZE)
??????.addComponent(text_name, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
?????.addPreferredGap(ComponentPlacement.RELATED)
?????.addComponent(textArea_chatArea, GroupLayout.PREFERRED_SIZE, 167, GroupLayout.PREFERRED_SIZE)
?????.addPreferredGap(ComponentPlacement.UNRELATED)
?????.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
??????.addComponent(lblNewLabel)
??????.addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
??????.addComponent(Button_send))
?????.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
??);
??contentPane.setLayout(gl_contentPane);
?}
}
----------------clientThread類---------------------
package com.WindFamilyRain6;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class ClientThread extends Thread {
?Socket socket;
?String MassageByReceive;
public ClientThread(Socket socket){
?this.socket=socket;
}
public void run(){
?try {
??InputStream is=socket.getInputStream();
??BufferedReader bf=new BufferedReader(new InputStreamReader(is));
? while(true){
???MassageByReceive=bf.readLine();
???System.out.println(bf.ready());
???System.out.println(MassageByReceive);
???sleep(100);
??}
?}catch (IOException e) {
??// TODO Auto-generated catch block
??e.printStackTrace();
?} catch (InterruptedException e) {
??// TODO Auto-generated catch block
??e.printStackTrace();
?}
}
}
謝謝啦
2016-08-11
while(true){
}