文档章节

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

徐航
 徐航
发布于 2013/04/20 17:35
字数 1499
阅读 232
收藏 3
点赞 0
评论 5

 

代码着实写的很混乱,花了一天多一点的时间来写。遇到很多问题,通过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
博文 28
码字总数 19400
作品 0
武汉
程序员
加载中

评论(5)

Timco
Timco

引用来自“徐航”的评论

引用来自“Timco”的评论

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

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

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

引用来自“Timco”的评论

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

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

引用来自“LuckyWiky”的评论

加油

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

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

祈澈姑娘 ⋅ 2017/12/20 ⋅ 0

NIO技术-4-Socket通道

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

李矮矮 ⋅ 2016/09/13 ⋅ 0

轻量级移动端即时通讯框架--MobileIMSDK

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

JackJiang- ⋅ 2015/11/27 ⋅ 2

[Nodejs]初探nodejs学习笔记- 如何使用nodejs搭建简单的UDP聊天功能

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

FRED丶DON ⋅ 2015/10/17 ⋅ 2

Jack Jiang/MobileIMSDK

快捷目录 ▌ 网络理论 网络编程理论经典《TCP/IP详解》(在线阅读版) ▌ 相关资料 MobileIMSDK版本更新日志 MobileIMSDK常见问题解答 MobileIMSDK性能测试报告 客户端Demo安装和使用帮助(An...

Jack Jiang ⋅ 2015/11/27 ⋅ 0

iOS版微信6.6.0发布:已撤回的消息可再次编辑

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

微信 ⋅ 2017/12/12 ⋅ 0

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

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

m7720eiosi6oa9 ⋅ 2017/12/12 ⋅ 0

NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo。服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了。同时...

JackJiang- ⋅ 2016/06/28 ⋅ 0

UDP数据包大小的问题

在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,这里仅对像ICQ一类的发送聊天消息的情况...

长平狐 ⋅ 2012/09/03 ⋅ 0

【网络原理】期末复习笔记 第八章 传输层

第八章 传输层 作者:xuan97916 功能: 可靠传输(超时丢包重传) 拥塞避免(发送自动感知网络是否拥塞) 流量控制(接收端控制发送端的发送速度) 8.1 传输层协议应用场景 TCP (Transmiss...

xuan97916 ⋅ 2017/06/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MySQL主从复制原理、半同步操作步骤及原理

1.1 企业Linux运维场景数据同步方案 1.1.1 文件级别的异机同步方案 1、scp/sftp/nc 命令可以实现远程数据同步。 2、搭建ftp/http/svn/nfs 服务器,然后在客户端上也可以把数据同步到服务器。...

xiaomin0322 ⋅ 9分钟前 ⋅ 0

Oracle10g 数据及文件迁移过程[原]

QL*Plus: Release 10.2.0.1.0 - Production on 星期三 5月 11 10:22:35 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved. 连接到: Oracle Database 10g Enterprise Edition Re......

harrypotter ⋅ 14分钟前 ⋅ 0

nginx安装

1:安装工具包 wget、vim和gcc yum install -y wget yum install -y vim-enhanced yum install -y make cmake gcc gcc-c++ 2:下载nginx安装包 wget http://nginx.org/download/nginx-1......

壹丶贰 ⋅ 17分钟前 ⋅ 0

ideaVim安装及配置

1.安装插件 File-Settings-Plugins,Browse Repositories,输入ideavim,安装。 重启后,在Tools-Vim Emulator启用。 2.快捷键设置 ideaViim键与idea快捷键有冲突,可以在Settings-Other Se...

Funcy1122 ⋅ 22分钟前 ⋅ 0

MySQL中B+Tree索引原理

B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B...

浮躁的码农 ⋅ 36分钟前 ⋅ 0

两道面试题,带你解析Java类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa{ static { System.out.println("爷爷在静态代码块"); }} cl...

1527 ⋅ 40分钟前 ⋅ 0

SpringCloud(Data Flow)

dataflow-server

赵-猛 ⋅ 51分钟前 ⋅ 0

深入理解Java虚拟机

这本书我读到第8章,之后就是在读不下去了。 读到后面是一种痛苦的体验,太多的东西是不全面的,大量的专有名词是没有解释的,读到最后很多东西仅仅是一个侧面,所以我觉得,这本书不适合初学...

颖伙虫 ⋅ 56分钟前 ⋅ 0

NanoPi NEO core/ Ubuntu16.04单网卡配置3个IP地址(2个静态,1个动态)

配置 root@NanoPi-NEO-Core:/etc/network# cat interfacesauto loiface lo inet loopbackallow-hotplug eth0iface eth0 inet static address 172.31.188.249 netmask 255.......

SamXIAO ⋅ 今天 ⋅ 0

三步为你的App集成LivePhoto功能

摘要:LivePhoto是iOS9新推出的一种拍照方式,类似于拍摄Gif图或录制视频片段生成图片。如果没有画面感,可以联想《哈利波特》霍格沃茨城堡的壁画,哈哈,很炫酷有木有,但坑爹的是只有iphone6S以...

壹峰 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部