文档章节

笔记:先前的UDP聊天程序改良版

徐航
 徐航
发布于 2013/04/20 17:35
字数 1499
阅读 232
收藏 3

 

代码着实写的很混乱,花了一天多一点的时间来写。遇到很多问题,通过google也解决了一点。 程序还有很多问题,同时打开两个会出现空指针异常。 
关于监听端口,接收端属于一个单独的类,于是要想监听指定的端口需要得到另一个类中的数据,这个数据需要用static修饰,这样才能被接收窗口类得到。 
将程序打成jar包:分别将源文件进行编译,在新建一个文件,在文件中输入:Main-Class: 包名.类名,然后回车。然后:jar -cvfm chat.jar chat.txt com 
 编程过程中遇到一个问题: JTextArea jta = new JTestArea(); JScrollPane jsp = new JScrollPane(jta); JScrollBar jsb = jsp.getVerticalScrollBar(); jsb.setValue(jsb.getMaximum()); 不能将jscrollbar滚动条保持在文本框的最底端,滚动条一直在中间。 并且测试的时候需要两次调用 jsb.setValue(jsb.getMaximum());才能实现滚动条在最底端。 http://www.oschina.net/question/860036_107149 后来在google上搜到一个方法,不过现在也不知道是什么原因。 http://tips4java.wordpress.com/2008/10/22/text-area-scrolling/ 
Based on my observations, when using JDK1.4.2, I have noticed that two requirements must be met for automatic scrolling: the append(…) must be done on the Event Dispatch Thread the caret must currently be positioned at the end of the text area before the append(…) method is invoked

 

  有时候真的很不想学习,一方面是对学的东西都没兴趣,另一方面有点自暴自弃的感觉,总感觉快毕业了却什么都不会。

  这学期课不多,而且好几门课都在期中就结课,其中一门要交一个网络编程的内容,这也是为什么花一天半来写这个破玩意。不过老师教的是C++,本来C++就好难,而且讲的一点头绪都没有,所以干脆不听。不过老师说也可以教java,所以,我可是肩负全宿舍的重任啊

  还是说说一个人写代码过程中遇到的一些问题吧。

==================代码很烂,但是还在学习嘛,慢慢进步撒==================

 

1、一个外部类A,要获取B类对象b的值,B中的b应该用public static 修饰。在google搜索的时候找到另一种方法:http://stackoverflow.com/questions/4089532/accessing-swing-components-of-another-class

 

In order to access the components of gameWindow in gameEngine you need a reference to it. So I assume that GameWindow class creates the instance of GameEngine. Then you can do something like this:
public class GameEngine{
      GameWindow window;
      public GameEngine(GameWindow gm){
           window = gm;
      }
 }
 public class GameWindow(){
     GameEngine ge = new GameEngine(this);
}

不过看了一会感觉整个人都绕进去了。然后又写了个类似的程序测试

public class Demo {
	Info info = null;
	public Demo(Info i){
		this.info = i;
	}
	public static void main(String[] args){
		Demo d1 = new Demo(new Info());
		System.out.println(d1.info.i);
	}
}
class Info{
	int i ;
	String name ;
	Demo d = new Demo(this);
	public Info(){
		this.i=123;
		this.name = "zhangsan";
	}	
}

 

Demo d1 = new Demo(new Info());

 

public class Test2 {
	public static void main(String[] args) {
		Info in = new Info();
		in.i = 10;
		in.name = "lisi";
	}
}

谁给讲讲,如果在其他类中有一个Info对象,并且对数据也进行过修改,Demo类或者其他的类要获取修改后的值用这种方法可以得到吗?

2、在接收端用DatagramSocket绑定端口的时候,并不是想一初始化就绑定一个端口,这样在打开第二个程序的时候绑定相同的端口会报错。于是就准备在程序打开的时候先出来一个对话框,要求输入监听的端口和目的端口,目的端口后面可以修改,监听端口不能。当输入监听端口后用刚才讲到的方法拿到输入的端口号并简单的判断下,此时才绑定端口。这样打开多个窗口只要输入的监听端口不一样并且和系统以及应用程序使用的端口号不重复就不会报错。

3、还有一个不好解决的问题就是关于滚动条的,当接收到的信息过多的时候会出现滚动条。但是滚动条一直保持在滚动栏的最顶端,这样如果要看到信接收的信息需要不停的拉动滚动条。在网上找到的方法是调用JScrollBar的setValue()方法,将值设为滚动条的最大值。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Pattern;

import javax.swing.*;

public class Test1 extends JFrame{
	Container cont = this.getContentPane();
	JPanel jpanel = new JPanel();
	JTextArea jta = null;
	JScrollPane jsp = null;
	JScrollBar jsb = null;
	public Test1(){
		cont.setLayout(new BorderLayout());
		jpanel = new JPanel();
		jta = new JTextArea(5,5);
		for(int i =0 ;i<15;i++){
			jta.append(i+":++\r\n");
		}
		jsp = new JScrollPane(jta);
		jsb = jsp.getVerticalScrollBar();
		//光标移到文本末
		//jta.setCaretPosition(jta.getDocument().getLength());

		//设置滚动条位置
		/*----------------------------问题在这----------------------------*/
		jsb.setValue(jsb.getMaximum());
		jsb.setValue(jsb.getMaximum());
		/*----------------------------问题在这----------------------------*/
		jpanel.add(jsp);
		this.add(jpanel,BorderLayout.NORTH);
		this.setBounds(400, 200, 500, 450);
		this.setResizable(false);
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);	
	}
	public static void main(String[] args) {
		new Test1();
	}
}

问题是调用一次的话滚动条只是出现在滚动栏的中间部分,当调用两次就奇迹般的滚到最下面的。实在是不知道怎么搞。

同样,用google搜到说需要将光标移到文档末,一试,果然就好了。还是不知道怎么搞的。

4、编写过程中也有很多小问题,但是记不清了,不过慢慢的试并百度谷歌搜一下就解决了,所以写不出来了。

5、备忘一下吧,将程序打成jar包:

    ①编译,在源文件的目录中javac -d . Source.java。编译后的文件保存在当前目录下。

    ②编写配置文件,新建一个文件“doc”(文件名任意),在文件中输入Main-Class: cn.edu....Source

        Main-Class: 包名.包含main函数的类。冒号和包名之间有空格,并且在类的后面要回车

    ③打包,jar -cvfm des.jar doc cn

        des.jar是打包后的jar文件的文件名

        doc是配置文件

        cn是包名开头的那个文件夹,一般建包的时候都是按域名从大往小写,所以在cn文件夹下有edu文件夹

                直到包含class文件的目录,所以cn就包含了所有的class文件

  

© 著作权归作者所有

共有 人打赏支持
徐航
粉丝 15
博文 25
码字总数 17745
作品 0
武汉
程序员
加载中

评论(5)

Timco
Timco

引用来自“徐航”的评论

引用来自“Timco”的评论

我也遇到,开启两个就会出现空指针异常,楼主发现是原因了没?

应该不会啊,如果开启两个监听相同的端口倒是会报异常。

谢了。应该是因为监听相同窗口的原因
徐航
徐航

引用来自“Timco”的评论

我也遇到,开启两个就会出现空指针异常,楼主发现是原因了没?

应该不会啊,如果开启两个监听相同的端口倒是会报异常。
Timco
Timco
我也遇到,开启两个就会出现空指针异常,楼主发现是原因了没?
徐航
徐航

引用来自“LuckyWiky”的评论

加油

(* ̄︶ ̄*)谢
LuckyWiky
LuckyWiky
加油
案例:多任务版udp聊天器

案例:多任务版udp聊天器 说明 编写一个有2个线程的程序 线程1用来接收数据然后显示 线程2用来检测键盘数据然后通过udp发送数据 要求 实现上述要求 总结多任务程序的特点 参考代码: 说明 编写...

祈澈姑娘
2017/12/20
0
0
NIO技术-4-Socket通道

一、Socket通道介绍 Socket通道即套接字通道,是一种基于TCP连接协议传输数据的通道。Socket通道可以以分阻塞模式运行,并且可以被Reactor设计模式使用,因为Socket通道是可供选择的,其继承...

李矮矮
2016/09/13
34
0
轻量级移动端即时通讯框架--MobileIMSDK

MobileIMSDK 是一套专为移动端开发的原创即时通讯高可重用框架: 超轻量级、高度提炼,lib包50KB以内; 完全基于UDP协议实现; 客户端支持iOS、Android、标准Java平台; 可应用于跨设备、跨网...

JackJiang-
2015/11/27
5K
2
iOS版微信6.6.0发布:已撤回的消息可再次编辑

微信官方今天发布了 iOS 平台的最新版本 6. 6.0,从版本号上就可以看出属于一次大更新(此前版本为 6.5.21)。 不过,新版公开的新特性并不是很多,最吸引人的“已撤回的消息可以再次编辑”,这...

微信
2017/12/12
0
0
微信重磅更新:发出的消息允许编辑!

关注一下,科技你好,不一样的科技资讯 微信又又又更新了,不过这次微信的更新可以说是非常有料了。 强烈推荐不解释!以下马上介绍微信iOS版6.6.0的新功能。 1、发出去的消息可以编辑 平时咱...

m7720eiosi6oa9
2017/12/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL 到底支不支持事务嵌套?

最近开发中遇到了使用MySQL,多次开启事务,出现了数据错乱问题,伪代码如下: begin; # 操作1 begin; # 操作2 rollback; 执行完后出现了操作1的数据真正写入,只有操作2的数据回滚...

宇润
5分钟前
0
0
fastDfs应用(安装过程待写)

1.效果 2.安装 2.1 导入已经安装好fastDFS的镜像 2.1.1 导入镜像 2.1.2 更改系统兼容性 2.1.3 开机 2.1.4 修改 一下内容 2.1.4.1 修改系统的ip 原来系统ip...

Lucky_Me
9分钟前
0
0
5. Python3源码—字符串(str)对象

5.1. 字符串对象 字符串对象是“变长对象”。 5.1.1. Python中的创建 Python中字符串(strs)对象最重要的创建方法为PyUnicode_DecodeUTF8Stateful,如下Python语句最终会调用到PyUnicode_D...

Mr_zebra
28分钟前
1
0
第十章:路由网关(Zuul)进阶:过滤器、异常处理

第十章:路由网关(Zuul)进阶:过滤器、异常处理 简单介绍了关于Zuul的一些简单使用以及一些路由规则的简单说明。而对于一个统一网关而言,需要处理各种各类的请求,对不同的url进行拦截,或者...

DemonsI
30分钟前
0
0
nginx屏蔽指定接口(URL)

Step1:需求 web平台上线后,需要屏蔽某个服务接口,但又不想重新上线,可以采用nginx屏蔽指定平台接口的办法 Step2:具体操作 location /dist/views/landing/UNIQUE_BEACON_URL { re...

Linux_Anna
39分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部