- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是java新手,我尝试用TCP Socket编写一个简单的客户端服务器,但经过几天的努力后我遇到了麻烦,我无法解决这个问题。
我使用 BufferReader.Readline(); 得到 null;
我的服务器代码:
启动服务器代码
public class StartServer {
ServerSocket server;
public StartServer(){
try {
server = new ServerSocket(4444);
} catch (Exception e) {
System.out.println("server can't listen to this port");
}
System.out.println("Listening for clients on 4444...");
int id =0;
while(true)
{
try {
Socket client = server.accept();
ServerThread svThread = new ServerThread(client, id++);
svThread.start();
} catch (Exception e) {
System.out.println("Error.......");
}
}
}
public static void main(String[] args) {
new StartServer();
}
}
服务器线程:
public class ServerThread extends Thread{
Socket client;
int clientID = 0;
boolean threadRun = true;
BufferedReader inputFromClient = null;
PrintWriter outputFromServer = null;
public ServerThread(Socket socket, int cID) {
client = socket;
clientID = cID;
}
public void run() {
try {
inputFromClient = new BufferedReader(new InputStreamReader(client.getInputStream()));
outputFromServer = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
System.out.println("ClientID: " + clientID);
while(threadRun){
String textFromClient = inputFromClient.readLine();
System.out.println("Client ID: " + clientID + " Client says: " + textFromClient);
if(textFromClient.equals("Quit")){
threadRun = false;
System.out.println("Stop client Thread from: " + clientID);
}else{
outputFromServer.print(textFromClient);
outputFromServer.flush();
}
}
} catch (IOException ex) {
Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
}finally{
try {
inputFromClient.close();
outputFromServer.close();
client.close();
System.out.println("Server Stopped...");
} catch (Exception e) {
}
}
}
}
我的客户端我使用 JFrame 调用面板并使用文本字段和 jbutton 向服务器发送消息
但是当我发送一条消息时,服务器可以接收该消息并将其打印到命令行,但它继续尝试从客户端获取消息(因为它在 while 循环内),但它收到 null,我不知道在这种情况下
我的客户端代码:
JFrame代码:
public class NewJFrame extends javax.swing.JFrame {
/**
* Creates new form NewJFrame
*/
Panel1 p ;
public NewJFrame() {
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jDesktopPane1 = new javax.swing.JDesktopPane();
jPanel1 = new javax.swing.JPanel();
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jButton1.setText("jButton1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addContainerGap(196, Short.MAX_VALUE)
.addComponent(jButton1)
.addGap(91, 91, 91))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(83, 83, 83)
.addComponent(jButton1)
.addContainerGap(134, Short.MAX_VALUE))
);
jPanel1.setBounds(0, 0, 360, 240);
jDesktopPane1.add(jPanel1, javax.swing.JLayeredPane.DEFAULT_LAYER);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jDesktopPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 365, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 35, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jDesktopPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 265, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 35, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
p = new Panel1();
jDesktopPane1.removeAll();
jDesktopPane1.repaint();
jDesktopPane1.revalidate();
p.setBounds(0, 0, 840, 558);
p.setSize(840,558);
jDesktopPane1.add(p);
p.show();
}
/**
* @param args the command line arguments
*/
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 ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/*
* Create and display the form
*/
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JDesktopPane jDesktopPane1;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
我的面板代码:
public class Panel1 extends javax.swing.JPanel {
Socket s;
PrintWriter outPut = null;
/**
* Creates new form Panel1
*/
public Panel1() {
initComponents();
ConnectServer();
//sendToServer();
// receiveFromServer();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
public void ConnectServer(){
try {
s = new Socket("localhost", 4444);
System.out.println("Connect to server");
outPut = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
// PrintWriter outPut = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
//outPut.println("Test cai coi.....");
//outPut.flush();
} catch (UnknownHostException ex) {
Logger.getLogger(Panel1.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Panel1.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void receiveFromServer(){
try {
BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println(input.readLine());
} catch (IOException ex) {
Logger.getLogger(Panel1.class.getName()).log(Level.SEVERE, null, ex);
}
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jTextField1 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jButton1.setText("jButton1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(26, 26, 26)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton1)
.addContainerGap(157, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(34, 34, 34)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jButton1))
.addContainerGap(243, Short.MAX_VALUE))
);
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//PrintWriter outPut = null;
PrintWriter outToServer = null;
BufferedReader input = null;
try {
// TODO add your handling code here:
outToServer = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
String txtFromClient = jTextField1.getText();
// String clientText = input.readLine();
System.out.println(txtFromClient);
outToServer.println(txtFromClient);
outToServer.flush();
//
//outPut.flush();
//System.out.println(input.readLine());
} catch (Exception ex) {
Logger.getLogger(Panel1.class.getName()).log(Level.SEVERE, null, ex);
} finally {
//outPut.close();
outToServer.close();
}
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JTextField jTextField1;
// End of variables declaration
}
以及我来自服务器的堆栈跟踪:
Exception in thread "Thread-0" java.lang.NullPointerException
at testserverclient.ServerThread.run(ServerThread.java:39)
第 39 行是:
if(textFromClient.equals("Quit"))
最佳答案
当 BufferedReader.readLine() 返回 null 时,意味着没有更多数据可供读取。您已到达流的末尾。 (通常对于套接字,这意味着另一端关闭了连接。)
当然,null
不是一个对象,null.equals(anything)
会抛出异常。
您可以通过说类似的话来避免异常
if (textFromClient == null || textFromClient.equals("Quit"))
因为任一情况都意味着客户端已完成并且应终止连接。
对于客户端...关闭 Socket 提供给您的流(正如您在 jButton1ActionPerformed 中所做的那样),也会关闭 Socket。您可能希望将最顶层的流成员字段设置为客户端中的某个位置,以便您可以在调用之间保留它们。
关于Java Socket BufferReader.readline 获取 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9845410/
最近开始学习oracle和sql。 在学习的过程中,我遇到了几个问题,我的 friend 在接受采访时被问到这些问题。 SELECT * FROM Employees WHERE NULL IS N
这个问题在这里已经有了答案: Can we subtract NULL pointers? (4 个回答) 关闭 2 个月前。 是否定义了NULL - NULL? (char *)NULL - (ch
是否有推荐的方法(根据 .net Framework 指南)检查 null,例如: if (value == null) {//code1} else {//code2} 或 if (value !=
我正在尝试将值插入数据库,但出现这样的错误任何人都可以告诉我为什么该值为空,如下所示: An exception occurred while executing 'INSERT INTO perso
这个问题在这里已经有了答案: String concatenation with a null seems to nullify the entire string - is that desire
您好,我正在 Android 联系人搜索模块中工作。我正在查询下方运行。 cur = context.getContentResolver().query(ContactsContract.Data.
下面的 SQL 表定义说明了从我的 MYSQL 数据库创建表的语句之一,该数据库是由我公司的前开发人员开发的。 DROP TABLE IF EXISTS `classifieds`.`category
我主要有应用程序开发背景。在编程语言中 variable == null或 variable != null有效。 当涉及到 SQL 时,以下查询不会给出任何语法错误,但也不会返回正确的结果。 sel
我在尝试检查某些元素是否为 NULL 时遇到段错误或不。任何人都可以帮忙吗? void addEdge(int i, int j) { if (i >= 0 && j > 0)
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
下面查询的关系代数表达式是什么?我找不到“Is Null”的表达式。 SELECT reader.name FROM reader LEFT JOIN book_borrow ON reader.ca
我正在尝试使用三元运算符来检查值是否为 null 并返回一个表达式或另一个。将此合并到 LINQ 表达式时,我遇到的是 LINQ 表达式的 Transact-SQL 转换试图执行“column = n
我在给定的代码中看到了以下行: select(0, (fd_set *) NULL, (fd_set *) NULL, (fd_set *) NULL, &timeout); http://linux
var re = /null/g; re.test('null null'); //> true re.test('null null'); //> true re.test('null null')
这个问题在这里已经有了答案: 关闭 13 年前。 我今天避开了一场关于数据库中空值的激烈辩论。 我的观点是 null 是未指定值的极好指示符。团队中有意见的其他每个人都认为零和空字符串是可行的方法。
由于此错误,我无法在模拟器中运行我的应用: Error:null value in entry: streamOutputFolder=null 或 gradle - Error:null value
我正在尝试在 Android 应用程序中创建电影数据库,但它返回错误。知道这意味着什么吗? public Cursor returnData() { return db.query(TABLE
我一直在检查浏览器中的日期函数以及运行时间 new Date (null, null, null); 在开发工具控制台中,它给出了有效的日期 Chrome v 61 回归 Sun Dec 31 189
为什么 NA==NULL 会导致 logical (0) 而不是 FALSE? 为什么 NULL==NULL 会导致 logical(0) 而不是 TRUE? 最佳答案 NULL 是一个“零长度”对象
我是一名优秀的程序员,十分优秀!