文档章节

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

徐航
 徐航
发布于 2013/04/20 17:35
字数 1499
阅读 233
收藏 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
[Nodejs]初探nodejs学习笔记- 如何使用nodejs搭建简单的UDP聊天功能

何为UDP(User Datagram Protocol)? 从baidu摘过来一段:UDP,用户数据报协议,与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连...

FRED丶DON
2015/10/17
2.7K
2
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

没有更多内容

加载失败,请刷新页面

加载更多

关于ComponentOne For WinForm 的全新控件 – DataFilter数据切片器(Beta)

概述 数据切片器在电子商务网站上很常见 - 它们可以帮助用户快速过滤所选商品,并且所有过滤选项都可以在一个地方使用,通常包含核心控件类型为:清单,范围栏和单选按钮等。在ComponentOne ...

葡萄城技术团队
16分钟前
1
0
Spring Data JPA 常见异常

异常一: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; nested exception i......

小99
16分钟前
1
0
聊聊flink的EventTime

序 本文主要研究一下flink的EventTime SourceFunction flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/functions/source/SourceFunction.java /** * Inte......

go4it
29分钟前
1
0
如何解决 homebrew 更新慢的问题

之前一直困扰于 Homebrew 的更新速度,曾试过修改更新源(清华、中科大等)的方式,但是并没什么卵用;也试过设置 curl 代理的方式,但是 brew 走的好像不是 curl 的方式,所以也没用。 通过...

whoru
34分钟前
4
0
TiDB EcoSystem Tools 原理解读系列(二)TiDB-Lightning Toolset 介绍

简介 TiDB-Lightning Toolset 是一套快速全量导入 SQL dump 文件到 TiDB 集群的工具集,自 2.1.0 版本起随 TiDB 发布,速度可达到传统执行 SQL 导入方式的至少 3 倍、大约每小时 100 GB,适合...

TiDB
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部