IO(TCP程序设计)编程的一些问题请教

Jonas.hui 2014-08-27 01:50:56
下面的两端代码是从书上摘抄下来的,有些疑问请教各位:
需要实现服务器端与客户端的连接,然后由客户端向服务器端发送信息,服务器端接收后显示信息
服务器端代码如下:
import java.io.*;
import java.net.*;

public class MyTcp { // 创建类MyTcp
private BufferedReader reader; // 创建BufferedReader对象
private ServerSocket server; // 创建ServerSocket对象
private Socket socket; // 创建Socket对象socket

void getserver() {
try {
server = new ServerSocket(8998); // 实例化Socket对象
System.out.println("服务器套接字已经创建成功"); // 输出信息
while (true) { // 如果套接字是连接状态
System.out.println("等待客户机的连接"); // 输出信息
socket = server.accept(); // 实例化Socket对象
reader = new BufferedReader(new InputStreamReader(socket
.getInputStream())); // 实例化BufferedReader对象
getClientMessage(); // 调用getClientMessage()方法
}
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
}

private void getClientMessage() {
try {
while (true) { // 如果套接字是连接状态
if (reader.ready()) {
// 获得客户端信息
System.out.println("客户机:" + reader.readLine());
}
}
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
try {
if (reader != null) {
reader.close(); // 关闭流
}
if (socket != null) {
socket.close(); // 关闭套接字
}
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) { // 主方法
MyTcp tcp = new MyTcp(); // 创建本类对象
tcp.getserver(); // 调用方法
}
}


客户端代码如下:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

import javax.swing.*;
import javax.swing.border.*;

public class MyClien extends JFrame { // 创建类继承JFrame类
/**
*
*/
private static final long serialVersionUID = 1L;
private PrintWriter writer; // 声明PrintWriter类对象
Socket socket; // 声明Socket对象
private JTextArea ta = new JTextArea(); // 创建JtextArea对象
private JTextField tf = new JTextField(); // 创建JtextField对象
Container cc; // 声明Container对象

public MyClien(String title) { // 构造方法
super(title); // 调用父类的构造方法
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cc = this.getContentPane(); // 实例化对象

final JScrollPane scrollPane = new JScrollPane();
scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
getContentPane().add(scrollPane, BorderLayout.CENTER);
scrollPane.setViewportView(ta);
cc.add(tf, "South"); // 将文本框放在窗体的下部
tf.addActionListener(new ActionListener() {
// 绑定事件
public void actionPerformed(ActionEvent e) {
// 将文本框中信息写入流
writer.println(tf.getText());
// 将文本框中信息显示在文本域中
ta.append(tf.getText() + '\n');
ta.setSelectionEnd(ta.getText().length());
tf.setText(""); // 将文本框清空
}
});
}

private void connect() { // 连接套接字方法
ta.append("尝试连接\n"); // 文本域中提示信息
try { // 捕捉异常
socket = new Socket("127.0.0.1", 8998); // 实例化Socket对象
writer = new PrintWriter(socket.getOutputStream(), true);
ta.append("完成连接\n"); // 文本域中提示信息
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
}

public static void main(String[] args) { // 主方法
MyClien clien = new MyClien("向服务器送数据"); // 创建本例对象
clien.setSize(200, 200); // 设置窗体大小
clien.setVisible(true); // 将窗体显示
clien.connect(); // 调用连接方法
}
}


我有几个不明白的地方:
1、服务器端代买中关闭 reader和socket的代码
try {
if (reader != null) {
reader.close(); // 关闭流
}
if (socket != null) {
socket.close(); // 关闭套接字
}
} catch (IOException e) {
e.printStackTrace();
}
为什么要 reader != null 才执行 reader.close() ?
关键是,之前已实例化了 reader了 那么 这里的reader!=null 肯定是true啊,既然一定是true 为什么还要多此一举?

2、在客户端的代码中:
tf.addActionListener(new ActionListener() {
// 绑定事件
public void actionPerformed(ActionEvent e) {
// 将文本框中信息写入流
writer.println(tf.getText());
// 将文本框中信息显示在文本域中
ta.append(tf.getText() + '\n');
ta.setSelectionEnd(ta.getText().length());
tf.setText(""); // 将文本框清空
}
});
这个绑定的事件代码中 writer.println(tf.getText()); 究竟实现了什么功能?
麻烦讲的详细点,本人初学谢谢各位大神!!!
...全文
304 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
莫名的默默 2014-09-03
  • 打赏
  • 举报
回复
引用 4 楼 hjt3313555 的回复:
[quote=引用 1 楼 skgary 的回复:] 1. 估计这个问题你问作者,作者 也未必能回答。这种服务器的代码也真心不是一般能用的。。。。 2. writer.println(tf.getText()); 相当于往服务器发送了 tf的文本框中的内容,加上回车换行
大神,还有个问题: 下面的额的代码是 服务器 端 private void getClientMessage() 方法里面的 while (true) { // 如果套接字是连接状态 if (reader.ready()) { // 获得客户端信息 System.out.println("客户机:" + reader.readLine()); } } 我认为 既然使用了 while(true) 那么应该无限循环下去呀,为什么试行一次就跳出了? 如果我把这段代码修改为: while (true) { // 如果套接字是连接状态 if (reader.ready()) { // 获得客户端信息 System.out.println("123321"); } } 那么,会无限循环打印 123321 ,所以我推断:跳出的操作是 System.out.println("客户机:" + reader.readLine()); 完成的,但是System.out.println("客户机:" + reader.readLine()); 怎么会有这个跳出功能那??? 感谢您的答复!!! [/quote] try/catch 一般是出现异常了。。捕捉看看
skgary 2014-08-29
  • 打赏
  • 举报
回复
引用 4 楼 hjt3313555 的回复:
[quote=引用 1 楼 skgary 的回复:] 1. 估计这个问题你问作者,作者 也未必能回答。这种服务器的代码也真心不是一般能用的。。。。 2. writer.println(tf.getText()); 相当于往服务器发送了 tf的文本框中的内容,加上回车换行
大神,还有个问题: 下面的额的代码是 服务器 端 private void getClientMessage() 方法里面的 while (true) { // 如果套接字是连接状态 if (reader.ready()) { // 获得客户端信息 System.out.println("客户机:" + reader.readLine()); } } 我认为 既然使用了 while(true) 那么应该无限循环下去呀,为什么试行一次就跳出了? 如果我把这段代码修改为: while (true) { // 如果套接字是连接状态 if (reader.ready()) { // 获得客户端信息 System.out.println("123321"); } } 那么,会无限循环打印 123321 ,所以我推断:跳出的操作是 System.out.println("客户机:" + reader.readLine()); 完成的,但是System.out.println("客户机:" + reader.readLine()); 怎么会有这个跳出功能那??? 感谢您的答复!!! [/quote] 你的try/catch在while(true)外,有异常就跳出来了。 然后你再看客户端,是不是发了一次就断开了?
Jonas.hui 2014-08-28
  • 打赏
  • 举报
回复
引用 1 楼 skgary 的回复:
1. 估计这个问题你问作者,作者 也未必能回答。这种服务器的代码也真心不是一般能用的。。。。 2. writer.println(tf.getText()); 相当于往服务器发送了 tf的文本框中的内容,加上回车换行
大神,还有个问题: 下面的额的代码是 服务器 端 private void getClientMessage() 方法里面的 while (true) { // 如果套接字是连接状态 if (reader.ready()) { // 获得客户端信息 System.out.println("客户机:" + reader.readLine()); } } 我认为 既然使用了 while(true) 那么应该无限循环下去呀,为什么试行一次就跳出了? 如果我把这段代码修改为: while (true) { // 如果套接字是连接状态 if (reader.ready()) { // 获得客户端信息 System.out.println("123321"); } } 那么,会无限循环打印 123321 ,所以我推断:跳出的操作是 System.out.println("客户机:" + reader.readLine()); 完成的,但是System.out.println("客户机:" + reader.readLine()); 怎么会有这个跳出功能那??? 感谢您的答复!!!
Jonas.hui 2014-08-28
  • 打赏
  • 举报
回复
引用 2 楼 arofree 的回复:
1.if(reader != null) reader.close; // 习惯性检查引用,然后关闭,有时候会出现你没有预测到的情况,使用了空引用,导致异常 2.writer = new PrintWriter(socket.getOutputStream(), true); // 这句完成了PrintWriter对socket的OutStream的包装,然后操作writer就会将数据写入socket的OutStream,最终数据发出。 3.这些内容最好看一遍Java基础的书,你就融汇贯通了
大神,还有个问题: 下面的额的代码是 服务器 端 private void getClientMessage() 方法里面的 while (true) { // 如果套接字是连接状态 if (reader.ready()) { // 获得客户端信息 System.out.println("客户机:" + reader.readLine()); } } 我认为 既然使用了 while(true) 那么应该无限循环下去呀,为什么试行一次就跳出了? 如果我把这段代码修改为: while (true) { // 如果套接字是连接状态 if (reader.ready()) { // 获得客户端信息 System.out.println("123321"); } } 那么,会无限循环打印 123321 ,所以我推断:跳出的操作是 System.out.println("客户机:" + reader.readLine()); 完成的,但是System.out.println("客户机:" + reader.readLine()); 怎么会有这个跳出功能那??? 感谢您的答复!!!
莫名的默默 2014-08-27
  • 打赏
  • 举报
回复
1.if(reader != null) reader.close; // 习惯性检查引用,然后关闭,有时候会出现你没有预测到的情况,使用了空引用,导致异常 2.writer = new PrintWriter(socket.getOutputStream(), true); // 这句完成了PrintWriter对socket的OutStream的包装,然后操作writer就会将数据写入socket的OutStream,最终数据发出。 3.这些内容最好看一遍Java基础的书,你就融汇贯通了
skgary 2014-08-27
  • 打赏
  • 举报
回复
1. 估计这个问题你问作者,作者 也未必能回答。这种服务器的代码也真心不是一般能用的。。。。 2. writer.println(tf.getText()); 相当于往服务器发送了 tf的文本框中的内容,加上回车换行

62,621

社区成员

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

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