用Java的socket编程实现cs结构程序
今天太晚了,改天给你做一个,记得提醒我,这个如果只是要个简单的,我半个小时就搞定了
给我个邮箱
现在给贴出我的代码: 整个结构分两个工程
1。服务端工程NioServerjava: 采用nio 方式的异步socket通信,不仅可以实现你的服务器还可以让你多学习一下什么是nio
2。客户端工程UserClientjava: 采用Swing技术画了一个简单的UI界面,比较土,原因是我没那么多时间去设计界面,你需要的话可以自己去修改得漂亮点,相信不难
现在贴工程1:
package comnet;
import javaioIOException;
import javanetInetSocketAddress;
import javanetServerSocket;
import javanioByteBuffer;
import javaniochannelsSelectionKey;
import javaniochannelsSelector;
import javaniochannelsServerSocketChannel;
import javaniochannelsSocketChannel;
import javautilIterator;
import javautilSet;
public class NioServer {
public static final int SERVERPORT=5555;
public static final String USERNAME="wangzhirong";
public static final String PASSWORD="123456";
public static final String ISACK="ACK";
public static final String ISNAK="NAK!";
// Selector selector;//选择器
// SelectionKey key;//key。 一个key代表一个Selector 在NIO通道上的注册,类似主键;
// //取得这个Key后就可以对Selector在通道上进行操作
private ByteBuffer echoBuffer = ByteBufferallocate( 1024 );// 通道数据缓冲区
public NioServer(){
}
public static void main(String[] args) throws IOException {
NioServer ns=new NioServer();
nsBuildNioServer();
}
public void BuildNioServer() throws IOException{
/////////////////////////////////////////////////////////
///////先对服务端的ServerSocket进行注册,注册到Selector ////
/////////////////////////////////////////////////////////
ServerSocketChannel ssc = ServerSocketChannelopen();//新建NIO通道
sscconfigureBlocking( false );//使通道为非阻塞
ServerSocket ss = sscsocket();//创建基于NIO通道的socket连接
//新建socket通道的端口
ssbind(new InetSocketAddress("127001",SERVERPORT));
Selector selector=Selectoropen();//获取一个选择器
//将NIO通道选绑定到择器,当然绑定后分配的主键为skey
SelectionKey skey = sscregister( selector, SelectionKeyOP_ACCEPT );
////////////////////////////////////////////////////////////////////
//// 接收客户端的连接Socket,并将此Socket也接连注册到Selector ////
///////////////////////////////////////////////////////////////////
while(true){
int num = selectorselect();//获取通道内是否有选择器的关心事件
if(num<1){continue; }
Set selectedKeys = selectorselectedKeys();//获取通道内关心事件的集合
Iterator it = selectedKeysiterator();
while (ithasNext()) {//遍历每个事件
try{
SelectionKey key = (SelectionKey)itnext();
//有一个新联接接入事件,服务端事件
if ((keyreadyOps() & SelectionKeyOP_ACCEPT)
== SelectionKeyOP_ACCEPT) {
// 接收这个新连接
ServerSocketChannel serverChanel = (ServerSocketChannel)keychannel();
//从serverSocketChannel中创建出与客户端的连接socketChannel
SocketChannel sc = serverChanelaccept();
scconfigureBlocking( false );
// Add the new connection to the selector
// 把新连接注册到选择器
SelectionKey newKey = scregister( selector,
SelectionKeyOP_READ );
itremove();
Systemoutprintln( "Got connection from "+sc );
}else
//读客户端数据的事件,此时有客户端发数据过来,客户端事件
if((keyreadyOps() & SelectionKeyOP_READ)
== SelectionKeyOP_READ){
// 读取数据
SocketChannel sc = (SocketChannel)keychannel();
int bytesEchoed = 0;
while((bytesEchoed = scread(echoBuffer))> 0){
Systemoutprintln("bytesEchoed:"+bytesEchoed);
}
echoBufferflip();
Systemoutprintln("limet:"+echoBufferlimit());
byte [] content = new byte[echoBufferlimit()];
echoBufferget(content);
String result=new String(content);
doPost(result,sc);
echoBufferclear();
itremove();
}
}catch(Exception e){}
}
}
}
public void doPost(String str,SocketChannel sc){
boolean isok=false;
int index=strindexOf('|');
if(index>0){
String name=strsubstring(0,index);
String pswd=strsubstring(index+1);
if(pswd==null){pswd="";}
if(name!=null){
if(nameequals(USERNAME)
&& pswdequals(PASSWORD)
){
isok=true;
}else{
isok=false;
}
}else{
isok=false;
}
}else{
isok=false;
}
String result="";
if(isok){
result="ACK";
}else{
result="NAK!";
}
ByteBuffer bb = ByteBufferallocate( resultlength() );
bbput(resultgetBytes());
bbflip();
try {
scwrite(bb);
} catch (IOException e) {
eprintStackTrace();
}
bbclear();
}
}
下面贴工程2
import javaawtColor;
import javaawtDimension;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaioIOException;
import javaioInputStream;
import javaioOutputStream;
import javanetSocket;
import javanetUnknownHostException;
import javaxswingJButton;
import javaxswingJFrame;
import javaxswingJLabel;
import javaxswingJPanel;
import javaxswingJPasswordField;
import javaxswingJTextField;
public class UserClient implements ActionListener{
JFrame jf;
JPanel jp;
JLabel label_name;
JLabel label_pswd;
JTextField userName;
JButton jb;
JPasswordField paswrd;
JLabel hintStr;
public UserClient (){
jf=new JFrame("XXX 登陆系统");
jp=new JPanel();
jfsetContentPane(jp);
jfsetPreferredSize(new Dimension(350,220));
jpsetPreferredSize(new Dimension(350,220));
jpsetBackground(Colorgray);
label_name=new JLabel();
label_namesetPreferredSize(new Dimension(150,30));
label_namesetText("请输入帐户(数字或英文):");
userName=new JTextField();
userNamesetPreferredSize(new Dimension(150,30));
jpadd(label_name);
jpadd(userName);
label_pswd=new JLabel();
label_pswdsetPreferredSize(new Dimension(150,30));
label_pswdsetText("请输入密码:");
jpadd(label_pswd);
paswrd=new JPasswordField();
paswrdsetPreferredSize(new Dimension(150,30));
jpadd(paswrd);
jb=new JButton("OK");
jbsetPreferredSize(new Dimension(150,30));
jbsetText("确 定");
jbaddActionListener( this);
jpadd(jb);
hintStr=new JLabel();
hintStrsetPreferredSize(new Dimension(210,40));
hintStrsetText("");
hintStrsetForeground(ColorRED);
jpadd(hintStr);
jfpack();
jfsetVisible(true);
jfsetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
}
private String name;
private String pswd;
public void actionPerformed(ActionEvent e) {
name=userNamegetText()trim();
pswd=new String(paswrdgetPassword());
if(pswd==null){
pswd="";
}else{
pswd=pswdtrim();
}
if(name!=null && namelength()>0){
hintStrsetText("正在验证客户端,请稍候");
start();
}
}
OutputStream os;
Socket s;
InputStream is;
public void start(){
//建立联网线程
new Thread(new Runnable(){
public void run() {
try {
s=new Socket("127001",5555);
//写
os=sgetOutputStream();
oswrite(namegetBytes());
oswrite('|');//用户名与密码用"|"分隔
oswrite(pswdgetBytes());
osflush();
//读内容
Threadsleep(1000);
is=sgetInputStream();
int len=isavailable();
Systemoutprintln("len:"+len);
byte[] bytes=new byte[len];
isread(bytes);
String resut=new String(bytes);
Systemoutprintln("resut:"+resut);
//TODO 这里通过返回结果处理
if(resutequals("ACK")){
hintStrsetText("验证成功,欢迎光临!");
}else{
paswrdsetText(null);
hintStrsetText("用户名或密码错误,请重新输入");
}
} catch (UnknownHostException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
} catch (InterruptedException e) {
eprintStackTrace();
}finally{
// try {
// osclose();
// isclose();
// sclose();
// } catch (IOException e) {
// eprintStackTrace();
// }
}
}
})start();
}
public static void main(String[] args) {
new UserClient();
}
}
name=jtf1getText()trim();
mima=jtf2getText()trim();
// Systemoutprintln(name);
// Systemoutprintln(mima);
String drivername="commicrosoftsqlserverjdbcSQLServerDriver";
String dburl="jdbc:sqlserver://localhost:54035;DatabaseName=mydata";
String user="sa";
String password="123";
if(nameequals("")||mimaequals(""))//如果没输用户名或密码,则提示对不起,请输入用户名或密码
{
JOptionPaneshowMessageDialog(jf,"对不起,请输入用户名或密码");
}
else//如果都有数据了就开始连接数据库验证
{
try
{
ClassforName(drivername);
con1=DriverManagergetConnection(dburl,user,password);
Systemoutprintln("成功加载驱动,成功连接服务器");
sta1=con1createStatement();
res1=sta1executeQuery("select from login where name='"+name+"'");
Systemoutprintln("执行完毕");
Systemoutprintln("收工");
if(res1next())//如果存在,就验证密码
{
if(res1getString("pwd")equals(mima))//如果密码正确就提示,反之
{
JOptionPaneshowMessageDialog(jf, "系统登录成功,恭喜你!");
jfsetVisible(false);
Students student=new Students();
studentmethod();
}
else
{
JOptionPaneshowMessageDialog(jf,"对不起,密码错误,请重新输入,登陆失败");
}
}
else//如果没有查找到用户名就提示
{
JOptionPaneshowMessageDialog(jf,"用户名不存在,请重新输入,错误!");
}
}
catch(Exception ee)
原来象我一样的朋友不少啊,我原来就这样做了,但是后来因为带宽的问题放弃了,自己做服务器当然是方便多,也好管理。
上面的说的很对,动态解析用花生壳软件就很好,这个软件我现在的网站上也有,你可以去看一下,有时间也可以和我QQ交流啊。
花生壳是完全免费的桌面式域名管理和动态域名解析(DDNS)等功能为一体的客户端软件。
花生壳客户端向用户提供全方位的桌面式域名管理以及动态域名解析服务。用户无需通过IE浏览器,直接通过客户端使用wwworaynet所提供的各项服务,包括花生护照注册、域名查询、域名管理、IP工具以及自诊断等各种服务;且通过树状结构方式可使用户对多达上百个域名进行方便管理,亦可自主添加二级域名,自由设置A记录(IP指向)、MX记录、CName(别名)、URL重定向等,用户操作界面清晰简单。
http://wwwwishdowncom/Software/catalog23/1228html
mvnForum
mvnForum是基于javaJ2EE 技术(Jsp/Servlet)的一个开源论坛,安装简单。mvnForum兼容任何Servlet容器,支持Jsp 12 and Servlet 23。
更多mvnForum信息
JForum
JForum 是一个功能强大 ,易于管理的论坛。它的设计完全遵从MVC设计模式,能够在任何Servlet容器与EJB服务器上运行。而且可以轻松的定制与扩展JForum论坛。
更多JForum信息
xforum
国人开发的一个开源论坛,基于 Struts 技术,是学习 Struts 的一个非常好的范例。它用到 JAAS 实现 Security ,中文问题的解决,数据层用到 DAO ,以及基于 Struts 应用的基本架构,都是个非常好的学习。
更多xforum信息
jGossip
jGossip是一个简单,功能强大的java论坛。可运用j2EE在平台上。采用Struts framework技术。
更多jGossip信息
FreeForums
一个基于XML的Java2企业级的论坛解决方案。FreeForums页面采用CSS, DHTML 与JavaScript等技术。这样用户可以定制自已喜欢的界面。它还提供一个在Windows下的客户端程序。
更多FreeForums信息
Sk Forum
SK Forum是一个开源的基于web的J2EE论坛应用程序。它是一个功能比较齐全的系统,包括很多功能比如:投票,wiki,定时跟踪,地址薄,好友薄以及其它一些小的功能。
更多Sk Forum信息
JsForum
JsForum是只用到jsp与Servlet技术的论坛,容易使用。具有一般论坛的功能。但是目前只能支持MYSQL数据库。
更多JsForum信息
nemesis-forum
一个使用J2EE技术的论坛。它的功能包括用户与用户组权限管理,支持i18n,内容过滤,综合搜索引擎,支持多种数据库。
更多nemesis-forum信息
Yazd
Yazd是一个使用JDBC连接数据库的论坛。它的特性包括:
1提供在线安装和配置。
2内容过滤(把Html代码转换成可显示的文件,自定义关键字过滤列表,隐藏urls的实现路径)。
3集成Lucene13提供关键字搜索功能。
4支持的数据库包括:Oracle,MySQL,DB2,Microsoft SQLServer,Sybase,Interbase,Hypersonic SQL,Pointbase,Informix和Postgres
5还有其它一些一个论坛应具备的基本功能。
这个论坛提供多语言支持其中包括简体中文。
更多Yazd信息
JavaBB
JavaBB基于java技术的类似于phpbb的论坛。
更多JavaBB信息
JForumFusion
JForumFusion是一个Java开源论坛。它主要的一些功能包括常规论坛功能,文件附件上传,个人信息,基于web的管理工具,UBBCode,和高性能的搜索引擎等。支持主流数据库包括:Oracle, DB2, MySQL, PostgreSQL, Sybase, SAP DB, HypersonicSQL, Microsoft SQL Server
更多JForumFusion信息
jzForum
这是一个利用Java开发的简单论坛以下列出它的几点特性:
完全支持BBCode,
在新贴提交时利用AJAX技术提供无刷新页面预览功能
利用lucene提供全文本搜索功能
用户可监控主题
可以容易更改样式(利用CSS几乎没有用到table)
安装简单只有一个war文件没有数据库(其实是内嵌hypersonic数据库)但 也支持其它数据库
包括一个投票系统
jzForum还提供RSS阅读功能并利用缓存技术提高整个论坛的速度
更多jzForum信息
BBS-CS
天乙社区是一套基于JAVA技术的网络虚拟社区,采用了Hibernate+Spring+Struts的轻量级J2EE框架
1、全文检索:天乙社区60采用Lucene全文检索,并支持完全国际化多语言的全文检索。
2、MVC框架:天乙社区60继续了5x的Struts框架,但经过优化,WEB端更加简洁高效。
3、集群支持:系统可以运行在集群上。
4、功能方面:大大加强了管理功能,用户可以多样化的定制系统的各项信息,包括用户级别、封锁IP、过滤字等等,论坛功能上主要增加了投票帖、上传附件类型多样、帖子中显示用户信息等等功能等。
更多BBS-CS信息
EasyJF
简易java框架开源论坛系统拥有常用论坛系统的基本功能,集前台后台代码为一体,支持UBB。该论坛系统使用基于OO的方法设计,采用多层B/S构架,数据库持久层主要使用简易数据库开源框架EasyDBO,Web层使用EasyJWeb框架,java代码与页面完全分离,易扩展。
更多EasyJF信息
参见:http://wwwopen-opencom/09htm
BAT基本上占住了整个云服务器市场吧,还有华为云,当然这些是市场主流,你说的不喜欢,可能是因为小客户,店大欺客,都是这样子的,不过每个行业都是属于自己的小用户,互盟云就还不错,这个售后我很喜欢,尤其是香港服务器,速度还蛮快的,就是价格相对小市场来说有点点贵,比阿里云便宜一点。亿速云,也还行,就是香港主机速度不咋的,价格是蛮便宜的,售后嘛,马马虎虎,不出问题都还好,出问题嘛,嗯,哪都一样。我用过的云服务器也不多,就几个大厂以及互盟云啊亿速云,综合一下,稍微贵点还是能接受吧,我会选择互盟,俗话说,好货不便宜,都是一样道理的,这个看你自己选择了。
0条评论