socket通讯的小程序编译时总是报错non-static variable s1In cannot be referenced from a static context”

tdsoft 2003-08-19 10:09:16
我想做一个socket通讯的小程序。server端有一个按钮两个文本框。点击按钮可把第一个文本框里的内容发送到client端。第二个文本框里实时显示client端发送过来的内容。
在编译时总是报错“non-static variable s1In cannot be referenced from a static context”。
server端代码如下:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

import java.io.*;
import java.net.*;
public class FrameSocketServer extends JFrame {
InputStream s1In;
DataInputStream dis;
JButton jButton1=new JButton();
ReadClientThread jTextField1=new ReadClientThread(dis);
JTextField jTextField2=new JTextField();

public FrameSocketServer() {
setTitle("YQserver");
setSize(new Dimension(500,500));
jButton1.setText("sender");
jButton1.setBounds(142,20,121,25);
jTextField1.setBounds(142,57,121,25);
jTextField2.setBounds(142,96,121,25);
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
send(e);
}
});
this.addWindowListener(new java.awt.event.WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
this.getContentPane().add(jButton1,null);
this.getContentPane().add(jTextField1,null);
this.getContentPane().add(jTextField2,null);
}

public static void main(String[] args) throws IOException {
FrameSocketServer frame=new FrameSocketServer();
frame.setVisible(true);


String toClient; //写到客户端的信息
boolean runable = true; //与客户端通话的状态
//创建SeverSocket的服务接口
ServerSocket serverSocket = null;
try {
//使该接口应用端口1111
serverSocket = new ServerSocket(1111);
} catch (IOException e) {
System.err.println("不能创建1111端口");
System.exit(1);
}

//创建Socket的客户接口,当有客户端的程序访问该服务接口时激活该类
Socket clientSocket = null;
try {
//通过accept()方法使服务器与客户端的Socket接口建立联系
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("访问端口失败");
System.exit(1);
}
//-----此处报错------------------------------------------------------
s1In = clientSocket.getInputStream();
dis = new DataInputStream(s1In);
//-----此处报错-------------------------------------------------------
}

void send(ActionEvent e){

}
}

class ReadClientThread extends JTextField implements Runnable {
DataInputStream dis;
String fromClient = "";
boolean runable = true;
private Thread clientThread=null;
public ReadClientThread(DataInputStream dis) {
this.dis = dis;
if (clientThread==null){
clientThread=new Thread(this,"ReadClient");
clientThread.start();
}
}

public void run() {
while(runable){
//显示客户端的信息
try{
fromClient = dis.readUTF();
if(fromClient.equals("")){
}
else
this.setText("客户端:" + fromClient);
}
catch(Exception e){runable = false;}
//当客户端输入Bye.时,服务端结束显示客户端信息与向客户端写入信息的两个循环
if(fromClient.equals("Bye.")) {
this.setText("客户端程序退出");
runable = false; //结束向客户写入信息循环
break; //结束显示客户端信息循环
}
}
}
}

请问该怎么修改
或者谁能给个用线程在文本框里显示socket接收到的信息的例子。

我试过把“InputStream s1In和DataInputStream dis”放在main函数里,程序可编译成功。可是“ReadClientThread jTextField1=new ReadClientThread(dis);
”这句该如何处理

...全文
121 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tdsoft 2003-08-19
  • 打赏
  • 举报
回复
谢谢三位。
我加了frame.就可以了。
Sundery(Sundery) 的方法。我用过,但是:
InputStream s1In;
DataInputStream dis;
JButton jButton1=new JButton();
//----------这一句用了dis可是不能放在public FrameSocketServer()----------------
ReadClientThread jTextField1=new ReadClientThread(dis);
//----------这一句用了dis可是不能放在public FrameSocketServer()---------------- JTextField jTextField2=new JTextField();

该怎么处理

KillAllError 2003-08-19
  • 打赏
  • 举报
回复
这种问题太小儿科了!
s1In 事非静态变量
public static void main(String[] args) 是个静态的方法!
先学好java基础知识。


InputStream s1In;
DataInputStream dis;
放到main里面应该就行了。
Ryan76 2003-08-19
  • 打赏
  • 举报
回复
你在Mian方法里引用了非静态变量
你可以将mian方法改造成FrameSocketServer的一个其它非静态方法,比如
public vois connect()
{
mian方法里面的内容
}
然后在Main里面实例化FrameSocketServer此类后在调用connect这个方法
你试着改改
总之mian方法里不要引用任何它所在类的成员变量
全放在方法里面处理
Sundery 2003-08-19
  • 打赏
  • 举报
回复
你把
InputStream s1In;
DataInputStream dis;

定义在:public FrameSocketServer() 里面就行了:)

试试看
三合一 2003-08-19
  • 打赏
  • 举报
回复
main是静态方法,所以不能直接引用类中的非静态变量,你可以这样
frame.s1In = clientSocket.getInputStream();
frame.dis = new DataInputStream(s1In);
三合一 2003-08-19
  • 打赏
  • 举报
回复
main是静态方法,所以不能直接引用类中的非静态变量,你可以这样
frame.s1In = clientSocket.getInputStream();
frame.dis = new DataInputStream(s1In);
tdsoft 2003-08-19
  • 打赏
  • 举报
回复
我一直在线:)
Sundery 2003-08-19
  • 打赏
  • 举报
回复
我也遇到这个问题了

你等一下,我中午之前告诉你答案:)
tdsoft 2003-08-19
  • 打赏
  • 举报
回复
急啊
olioli 2003-08-19
  • 打赏
  • 举报
回复
不懂:)
tdsoft 2003-08-19
  • 打赏
  • 举报
回复
up
tdsoft 2003-08-19
  • 打赏
  • 举报
回复
up
tdsoft 2003-08-19
  • 打赏
  • 举报
回复
up

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧