主题:求助!急!跪谢了!
大家好,我在写一个软件,下面是软件中的一部分,我把详细的说明,代码,出现的问题都写在下面了,希望朋友们能帮我看看到底是哪里出错了,跪谢了!!!
说明:此软件是简单的p2p软件,以下为方便,将作为服务端的peer称为服务端,将作为客户端的peer称为客户端。
环境:xp系统,jbuilder9
程序和控件的对应关系:
按钮 开始运行 --- jButton1
按钮 连接 --- jButton6
输入IP的地址框 --- jTextField2
显示IP的地方 --- jLabel3
各个部件完成的功能是:
1.“开始运行”(jButton1):无论客户端还是服务端,在打开软件后,先点击此按钮,实现用套接字监听的功能。
2.“连接”(jButton6):若客户端想要请求服务端的服务,则在“IP地址框”(jTextField2)中输入服务端的IP地址,然后点击“连接”,完成客户端和服务端的套接字的连接建立。同时,在服务端的“IP”(jLabel3)处显示出客户端的IP地址。
[color=#FF0000]下面是我的程序中的代码:[/color]
package ceshi;
import javax.swing.*;
import com.borland.jbcl.layout.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2009</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class Frame1 extends JFrame {
XYLayout xYLayout1 = new XYLayout();
JButton jButton1 = new JButton();
JLabel jLabel4 = new JLabel();
JLabel jLabel3 = new JLabel();
JLabel jLabel2 = new JLabel();
JTextField jTextField2 = new JTextField();
JButton jButton6 = new JButton();
public Frame1() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
jButton1.setFont(new java.awt.Font("Dialog", 0, 15));
jButton1.setText("开始运行");
this.setLocale(java.util.Locale.getDefault());
this.getContentPane().setLayout(xYLayout1);
jLabel4.setFont(new java.awt.Font("Dialog", 0, 15));
jLabel4.setText("客户端:");
jLabel3.setFont(new java.awt.Font("Dialog", 0, 15));
jLabel3.setText("IP");
jLabel2.setFont(new java.awt.Font("Dialog", 0, 15));
jLabel2.setText("输入目标地址");
jTextField2.setFont(new java.awt.Font("Dialog", 0, 15));
jTextField2.setToolTipText("");
jTextField2.setText("X.X.X.X");
jButton6.setFont(new java.awt.Font("Dialog", 0, 15));
jButton6.setText("连接");
this.getContentPane().add(jButton1, new XYConstraints(30, 30, 120, 37));
this.getContentPane().add(jLabel4, new XYConstraints(285, 232, 62, 41));
this.getContentPane().add(jLabel3, new XYConstraints(356, 236, 161, 34));
this.getContentPane().add(jTextField2, new XYConstraints(317, 329, 197, 41));
this.getContentPane().add(jButton6, new XYConstraints(378, 398, 92, 37));
this.getContentPane().add(jLabel2, new XYConstraints(335, 281, 112, 41));
}
//处理jFame关闭事件。
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
//已确定。
//以下程序是peer作为服务器监听情况下的代码,对应的事件是用户点击“开始运行”按钮。
//以下声明了一对类,Server和ServerThread。Server的main()方法创建了一个ServerSocket对象来监听端口6544上的连接请求,如果成功,
//Server进入一个无线循环中,交替调用ServerSocket的accept()方法来等待连接请求,同时启动后台线程处理连接,即accept()返回的请求。
//线程由ServerThread继承的start()方法开始,并执行ServerThread的run()方法中的代码。一旦run()方法运行,线程将创建BufferedReader
//对象以便数据传送。
class Server
{
public void static main () throws IOException {
ServerSocket server= new ServerSocket(6544) ; //建立一个server套接字,用来在6544号端口监听连接请求。
while(true)
{
Socket s=server.accept(); //侦听从客户程序发来的连接请求,建立连接,返回一个套接字对象来表示这个链接。
new ServerThread(s).start(); //开始一个线程来处理这个链接。
}
}
}
class ServerThread extends Thread
{
Socket s;
ServerThread(Socket s)
{
this.s=s;
}
public void run()
{
BufferedReader br=null;
try
{
InputStreamReader isr = new InputStreamReader(s.getInputStream()); //建立一个input stream reader,和套接字的字节输入流相关。input stream reader把从套接字中读取的字节转化为字符。
br = new BufferedReader(isr); //建立一个缓冲,它和input stream reader 相关。但是可以方便的整行读取文件。
}
catch(IOException e)
{
}
}
} //"开始运行"按钮对应的服务器监听代码结束。
//已确定。
//以下是peer作为客户端去连接作为服务器的peer的程序。此段程序和软件中的“连接”按钮相对应。当客户端在textfield中输入了一个IP地址时,客户端先读取
//该IP地址的内容,然后通过套接字链接到对应的服务器端,此时客户端和服务器端将建立起socket连接。并且在服务器端的“jLabel3”中显示客户端的IP地址。
void jButton6_actionPerformed(ActionEvent e) {
try
{
TextField textField2 = new TextField(); //再次声明public class Frame1 extends JFrame 中定义的textField2。
String IpAddress = textField2.getText(); //从textField2中读取服务端的IP地址。
Socket c = new Socket(IpAddress,6544); //建立和输入的IP地址相对应的服务端在端口6544上的连接。
//以下程序用来在服务器端的“jLabel3”即“客户端IP”处显示连接上的客户端的IP地址。
InetAddress ClientIp=InetAddress.getLocalHost(); //用ClientIp来保存客户端的IP地址。
String ClientIpString=ClientIp.toString(); //将客户端的IP转换成字符串类型。
StringTokenizer st = new StringTokenizer(ClientIpString, "/");
String ip_address = null;
while(st.hasMoreTokens())
{
ip_address = st.nextToken(); //客户端的IP临时保存在ip_address变量中。
jLabel3.setText(ip_address);
}
DataOutputStream out = new DataOutputStream(c.getOutputStream());
DataInputStream in = new DataInputStream(c.getInputStream());
String Message ="";
//for(int i=0;i<list1.getItemCount();i++)
//{
// Message = Message+list1.getItem(i)+"*";
//}
Message =ip_address +"*"+ Message;
out.writeUTF(Message);
in.close();
out.close();
c.close();
}
catch (Exception c)
{
c.printStackTrace(); //错误处理。
}
}
}
[color=#FF0000]下面是运行时出现的问题:[/color]
"Frame1.java": <identifier> expected at line 82, column 15
"Frame1.java": '(' expected at line 90, column 1
完毕!
说明:此软件是简单的p2p软件,以下为方便,将作为服务端的peer称为服务端,将作为客户端的peer称为客户端。
环境:xp系统,jbuilder9
程序和控件的对应关系:
按钮 开始运行 --- jButton1
按钮 连接 --- jButton6
输入IP的地址框 --- jTextField2
显示IP的地方 --- jLabel3
各个部件完成的功能是:
1.“开始运行”(jButton1):无论客户端还是服务端,在打开软件后,先点击此按钮,实现用套接字监听的功能。
2.“连接”(jButton6):若客户端想要请求服务端的服务,则在“IP地址框”(jTextField2)中输入服务端的IP地址,然后点击“连接”,完成客户端和服务端的套接字的连接建立。同时,在服务端的“IP”(jLabel3)处显示出客户端的IP地址。
[color=#FF0000]下面是我的程序中的代码:[/color]
package ceshi;
import javax.swing.*;
import com.borland.jbcl.layout.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2009</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class Frame1 extends JFrame {
XYLayout xYLayout1 = new XYLayout();
JButton jButton1 = new JButton();
JLabel jLabel4 = new JLabel();
JLabel jLabel3 = new JLabel();
JLabel jLabel2 = new JLabel();
JTextField jTextField2 = new JTextField();
JButton jButton6 = new JButton();
public Frame1() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
jButton1.setFont(new java.awt.Font("Dialog", 0, 15));
jButton1.setText("开始运行");
this.setLocale(java.util.Locale.getDefault());
this.getContentPane().setLayout(xYLayout1);
jLabel4.setFont(new java.awt.Font("Dialog", 0, 15));
jLabel4.setText("客户端:");
jLabel3.setFont(new java.awt.Font("Dialog", 0, 15));
jLabel3.setText("IP");
jLabel2.setFont(new java.awt.Font("Dialog", 0, 15));
jLabel2.setText("输入目标地址");
jTextField2.setFont(new java.awt.Font("Dialog", 0, 15));
jTextField2.setToolTipText("");
jTextField2.setText("X.X.X.X");
jButton6.setFont(new java.awt.Font("Dialog", 0, 15));
jButton6.setText("连接");
this.getContentPane().add(jButton1, new XYConstraints(30, 30, 120, 37));
this.getContentPane().add(jLabel4, new XYConstraints(285, 232, 62, 41));
this.getContentPane().add(jLabel3, new XYConstraints(356, 236, 161, 34));
this.getContentPane().add(jTextField2, new XYConstraints(317, 329, 197, 41));
this.getContentPane().add(jButton6, new XYConstraints(378, 398, 92, 37));
this.getContentPane().add(jLabel2, new XYConstraints(335, 281, 112, 41));
}
//处理jFame关闭事件。
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
//已确定。
//以下程序是peer作为服务器监听情况下的代码,对应的事件是用户点击“开始运行”按钮。
//以下声明了一对类,Server和ServerThread。Server的main()方法创建了一个ServerSocket对象来监听端口6544上的连接请求,如果成功,
//Server进入一个无线循环中,交替调用ServerSocket的accept()方法来等待连接请求,同时启动后台线程处理连接,即accept()返回的请求。
//线程由ServerThread继承的start()方法开始,并执行ServerThread的run()方法中的代码。一旦run()方法运行,线程将创建BufferedReader
//对象以便数据传送。
class Server
{
public void static main () throws IOException {
ServerSocket server= new ServerSocket(6544) ; //建立一个server套接字,用来在6544号端口监听连接请求。
while(true)
{
Socket s=server.accept(); //侦听从客户程序发来的连接请求,建立连接,返回一个套接字对象来表示这个链接。
new ServerThread(s).start(); //开始一个线程来处理这个链接。
}
}
}
class ServerThread extends Thread
{
Socket s;
ServerThread(Socket s)
{
this.s=s;
}
public void run()
{
BufferedReader br=null;
try
{
InputStreamReader isr = new InputStreamReader(s.getInputStream()); //建立一个input stream reader,和套接字的字节输入流相关。input stream reader把从套接字中读取的字节转化为字符。
br = new BufferedReader(isr); //建立一个缓冲,它和input stream reader 相关。但是可以方便的整行读取文件。
}
catch(IOException e)
{
}
}
} //"开始运行"按钮对应的服务器监听代码结束。
//已确定。
//以下是peer作为客户端去连接作为服务器的peer的程序。此段程序和软件中的“连接”按钮相对应。当客户端在textfield中输入了一个IP地址时,客户端先读取
//该IP地址的内容,然后通过套接字链接到对应的服务器端,此时客户端和服务器端将建立起socket连接。并且在服务器端的“jLabel3”中显示客户端的IP地址。
void jButton6_actionPerformed(ActionEvent e) {
try
{
TextField textField2 = new TextField(); //再次声明public class Frame1 extends JFrame 中定义的textField2。
String IpAddress = textField2.getText(); //从textField2中读取服务端的IP地址。
Socket c = new Socket(IpAddress,6544); //建立和输入的IP地址相对应的服务端在端口6544上的连接。
//以下程序用来在服务器端的“jLabel3”即“客户端IP”处显示连接上的客户端的IP地址。
InetAddress ClientIp=InetAddress.getLocalHost(); //用ClientIp来保存客户端的IP地址。
String ClientIpString=ClientIp.toString(); //将客户端的IP转换成字符串类型。
StringTokenizer st = new StringTokenizer(ClientIpString, "/");
String ip_address = null;
while(st.hasMoreTokens())
{
ip_address = st.nextToken(); //客户端的IP临时保存在ip_address变量中。
jLabel3.setText(ip_address);
}
DataOutputStream out = new DataOutputStream(c.getOutputStream());
DataInputStream in = new DataInputStream(c.getInputStream());
String Message ="";
//for(int i=0;i<list1.getItemCount();i++)
//{
// Message = Message+list1.getItem(i)+"*";
//}
Message =ip_address +"*"+ Message;
out.writeUTF(Message);
in.close();
out.close();
c.close();
}
catch (Exception c)
{
c.printStackTrace(); //错误处理。
}
}
}
[color=#FF0000]下面是运行时出现的问题:[/color]
"Frame1.java": <identifier> expected at line 82, column 15
"Frame1.java": '(' expected at line 90, column 1
完毕!