【发布时间】:2014-06-20 18:31:04
【问题描述】:
我正在尝试创建一个服务器和客户端应用程序,其中服务器可以向客户端发送消息,而客户端只能接受来自服务器的消息。
我已经实现了这个目标。问题是,client.jar 不会收到来自服务器的任何消息。但是在 netbean 中一切正常。
知道为什么会这样吗?
这是我完整的服务器代码:
public sServerUI() {
super("Server : "+System.getenv("COMPUTERNAME")); // mendapatkan nama komputer
initComponents();
}
public void startListener(){
Random randomGen = new Random();
try{
myPort = randomGen.nextInt(9999);
server = new ServerSocket(myPort);//Bebas portnya, tp nggk boleh sudah terpakai atau pakai random jg bisa
btnListen.setEnabled(false);
while(key == null) {
key = JOptionPane.showInputDialog(this, "Input your Key : ", "Insert Key", JOptionPane.PLAIN_MESSAGE);
}
if(key.equals("")) {
key = "Random";
txtMessage.setText(txtMessage.getText()+"Invalid key inputted, key automatically set to '"+key+"'\n");
} else txtMessage.setText(txtMessage.getText()+"Key set to '"+key+"'\n");
} catch (IOException e) {//Kalau sudah terpakai muncul error
JOptionPane.showMessageDialog(this, "Could not listen at " + myPort);
//Gagal, keluarin info
} finally{
myPort = server.getLocalPort();
lblPort.setText("Port: "+myPort);
System.out.println("Port: "+myPort);
}
acceptClient.start();
}
public void windowClosing(WindowEvent e){
try {
server.close();
for (int i=0;i<numberOfClient;i++){
socketIn[i].close();
socketOut[i].close();
}
} catch (IOException ex) {
System.out.println("Error "+ex.getMessage());
}
}
class Accepter extends Thread{
@Override
public void run(){
while (true){
try{
client[numberOfClient] = server.accept();
numberOfClient++;
lblStatus.setText("Status: "+numberOfClient+" client(s) connected");
Handler handleClient = new Handler(numberOfClient-1);
handleClient.start();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Accept failed: " + myPort);
}
}
}
}
class Handler extends Thread{
private int arr;
Handler(int ar){
arr = ar;
try{
socketIn[arr] = new BufferedReader(new InputStreamReader(client[arr].getInputStream()));
socketOut[arr] = new PrintWriter(client[arr].getOutputStream(), true);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Read failed");
}
}
@Override
public void run(){
while (true){
try{
if (socketIn[arr].ready()){
System.out.println("Reading...");
line = socketIn[arr].readLine();
if (!txtMessage.getText().equals("")){
txtMessage.setText(txtMessage.getText()+"\n");
//broadcast message ke client2 lain
}
txtMessage.setText(txtMessage.getText()+"Client "+(arr+1)+": "+line);
for (int i=0;i<numberOfClient;i++){
if (i!=arr){//jgn kembaliin ke client yg kirim
socketOut[i].println("Client "+(arr+1)+": "+line);
}
}
}
} catch (IOException e) {
System.out.println("Read failed");
}
}
}
}
private void btnListenActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
startListener();
}
private void sendData(String data) {
for (int j=0;j<numberOfClient;j++){
socketOut[j].println(data);
}
}
private void btnSendActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
if(numberOfClient > 0) {
int packetIndex = 1;
String ext = getExt(filePath, '.');
String sData = "start"+pemisahString+fByte.length+pemisahString+ext+pemisahString; //menaruh kata kunci 'start' dan ukuran file di awal message, serta extensionnya
sendData(sData);
sData = "";
int k = 0;
for(int i = 0; i < fByte.length; i++) {
if(k >= Math.ceil((double)fByte.length/10.0)) {
k = 0;
sData = rc4(key, sData);
sendData(Integer.toString(packetIndex)+pemisahString+sData);
txtMessage.setText(txtMessage.getText()+"packet-"+packetIndex+" sent ! isi : "+revertToString(rc4(key,revertToString(sData)))+"\n");
packetIndex++;
sData = "";
}
sData += fByte[i];
sData += pemisahString;
k++;
if(i == fByte.length-1) {
sData = rc4(key, sData);
sendData(Integer.toString(packetIndex)+pemisahString+sData);
txtMessage.setText(txtMessage.getText()+"packet-"+packetIndex+" sent ! isi : "+revertToString(rc4(key,revertToString(sData)))+"\n");
packetIndex++;
sData = "";
}
}
sData = "end"+pemisahString;
sendData(sData);
txtMessage.setText(txtMessage.getText() + "Done ! divided into "+k+" piece(s) per packet\n");
} else JOptionPane.showMessageDialog(this, "No Client Connected !", "Error", JOptionPane.ERROR_MESSAGE);
}
private void fileBtnActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("d:/Kul/Smstr 6/Kripto n Steno/Stream Cipher/"));
int returnVal = chooser.showOpenDialog(this);
if(returnVal == JFileChooser.APPROVE_OPTION) {
filePath = chooser.getSelectedFile().getPath();
try {
inputFile = new File(filePath);
fIn = new FileInputStream(inputFile);
fByte = new byte[(int)inputFile.length()];
System.out.println("file size : "+(int)inputFile.length()+" byte(s)");
System.out.print("Isi file : ");
fIn.read(fByte);
fIn.close();
for(int i = 0; i < fByte.length; i ++) {
System.out.print(fByte[i]+" ");
}
System.out.print("end of file\n");
String stringBuatDitampilin = getExt(filePath, (char)92);
txtMessage.setText(txtMessage.getText() + "'" + stringBuatDitampilin + "' Loaded !\n");
btnSend.setEnabled(true);
//fIn.close();
//JOptionPane.showMessageDialog(this, "File Loaded !", "Success", JOptionPane.INFORMATION_MESSAGE);
} catch(java.io.IOException e) {
JOptionPane.showMessageDialog(this, e.toString(), "IO Error", JOptionPane.ERROR_MESSAGE);
}
}
}
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(sServerUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new sServerUI().setVisible(true);
}
});
}
这是我完整的客户端代码:
public sClientUI() {
super("Client");
initComponents();
}
public void listenSocket(){
//Create socket connection
try{
socket = new Socket(txtHost.getText(), Integer.parseInt(txtPort.getText()));
socketOut = new PrintWriter(socket.getOutputStream(), true);
socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
txtMessage.setText(txtMessage.getText()+"Succesfully connected to "+txtHost.getText()+" !\n");
while(key == null) {
key = JOptionPane.showInputDialog(this, "Input your Key : ", "Insert Key", JOptionPane.PLAIN_MESSAGE);
}
if(key.equals("")) {
key = "Random";
txtMessage.setText(txtMessage.getText()+"Invalid key inputted, key automatically set to '"+key+"'\n");
} else txtMessage.setText(txtMessage.getText()+"Key set to '"+key+"'\n");
txtHost.setEditable(false);
txtPort.setEditable(false);
btnConnect.setEnabled(false);
myListener = new Timer(250, readLine);
myListener.start();
} catch (UnknownHostException e) {
JOptionPane.showMessageDialog(this, "Unknown host: "+e.getMessage(), "Unknown Hostname", JOptionPane.ERROR_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(this, "Either your hostname is wrong, or you entered wrong port number\n"+e.getMessage(),"Input Error", JOptionPane.ERROR_MESSAGE);
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(this, e.getMessage(),"Invalid Port Number", JOptionPane.ERROR_MESSAGE);
}
}
public void windowClosing(WindowEvent e){
try {
socket.close();
socketIn.close();
socketOut.close();
} catch (IOException ex) {
System.out.println("Error "+ex.getMessage());
}
}
ActionListener readLine = new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
try{
if (socketIn.ready()){
String tempReceiver;
if((tempReceiver = socketIn.readLine()) != null) {
exStr(tempReceiver); //untuk memotong-motong string dan meng-create file baru
}
}
} catch (IOException e) {
System.out.println("Read failed");
}
}
};
private void btnConnectActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
listenSocket();
}
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(sClientUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new sClientUI().setVisible(true);
}
});
}
.jar 客户端和服务器已经相互连接,它们只是无法发送或接收任何消息
【问题讨论】:
-
首先要检查的是防火墙配置。也尝试使用 localhost 地址运行服务器和客户端
-
@Tech 我已经设置了 Windows 防火墙(我使用的是 Windows 7),以允许我的应用程序使用网络进行入站和出站规则,但结果仍然相同。抱歉,如果我的下一个问题有点愚蠢,但是您的 localhost 地址是什么意思?是不是像“127.0.0.1”?
-
jar 文件是惰性对象。它不能“接收”任何东西。
-
@Bondle 是的,我就是这个意思。
-
也许你们中的一些人误认为我想要达到的目标,但问题已经解决了,我已经发布了答案;)还是谢谢
标签: java sockets netbeans jar executable-jar