求java nio网络编程的小例子,要求客户端一直与服务器保持连接

求java nio网络编程的小例子,要求客户端一直与服务器保持连接,第1张

import javaawt;
import javaawtevent;
import javaioIOException;
import javanet;
import javaio;
public class chatClient extends Frame {
/
@param args
/
TextField tfTxT=new TextField();
TextArea taContent=new TextArea();
Socket s=null;
DataOutputStream dos=null;
DataInputStream dis=null;
private boolean bConnected =false;

public static void main(String[] args) {
new chatClient()lunachFrame();
}

private class RecvThread implements Runnable{
public void run() {
try{
while(bConnected){
String str=disreadUTF();
taContentsetText(taContentgetText()+str+'\n');
}
}catch(IOException e){
eprintStackTrace();
}
}

}

public void lunachFrame(){
thissetLocation(400, 300);
thissetSize(300,300);
//thissetLayout(new FlowLayout());
thisadd(tfTxT,"South");
thisadd(taContent,"North");
pack();
tfTxTaddActionListener(new TFListener());
thisaddWindowListener(new WindowClose());
thissetVisible(true);
connect();
new Thread(new RecvThread())start();
}

public void connect(){
try {
s= new Socket("127001",8888);
dos =new DataOutputStream(sgetOutputStream());
dis =new DataInputStream(sgetInputStream());
Systemoutprintln("connected!");
bConnected=true;
} catch (UnknownHostException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
}
public void disconnect(){
try {
dosclose();
sclose();
} catch (Exception e) {
// TODO 自动生成 catch 块
eprintStackTrace();
}
}

class WindowClose extends WindowAdapter{
@Override
public void windowClosing(WindowEvent e) {
// TODO 自动生成方法存根
Systemexit(0);
disconnect();
}

}
private class TFListener implements ActionListener{

public void actionPerformed(ActionEvent e) {
String str=tfTxTgetText()trim();//trim去掉两边空格
//taContentsetText(str);
tfTxTsetText("");
try {
doswriteUTF(str);
dosflush();
//dosclose();

} catch (IOException e1) {
e1printStackTrace();

}
}
}
}
======================================
import javaioIOException;
import javanet;
import javaio;
import javautil;
public class ChatServer {
List<Client> clients=new ArrayList<Client>();
Client c=null;
public static void main(String[] args){
new ChatServer()start();
}
public void start(){
boolean started=false;
ServerSocket ss=null;
DataInputStream dis=null;
try{
ss=new ServerSocket(8888);
started =true;
}catch(Exception e)
{
eprintStackTrace();
}
try{
while(started){
Socket s=ssaccept();
c=new Client(s);//启动线程,实行run()方法
Systemoutprintln("a client connected!");
new Thread(c)start();//启动start方法,循环start是Thread中的方法与这上面的start无关
clientsadd(c);
//disclose();
}
} catch (Exception e) {
//eprintStackTrace();
}
finally{
try {
ssclose();
} catch (IOException e) {
// TODO 自动生成 catch 块
eprintStackTrace();
}
}
}
class Client implements Runnable{
private Socket s;
private DataInputStream dis =null;
private boolean bConnected =false;
private DataOutputStream dos=null;
public Client(Socket s){
thiss=s;
try {
dis=new DataInputStream(sgetInputStream());
dos =new DataOutputStream(sgetOutputStream());
bConnected =true;
} catch (IOException e) {
// TODO 自动生成 catch 块
eprintStackTrace();
}
}

public void send(String str)throws Exception{
doswriteUTF(str);

}

public void run() {
try{
while(bConnected){
String str = disreadUTF();
Systemoutprintln(str);
for(int i=0;i<clientssize();i++){
c=clientsget(i);
csend(str);
}
/for(Iterator<Client> it=clientsiterator();ithasNext();){
Client c=itnext();
csend(str);
}/
}
}catch(SocketException e){
clientsremove(this);
Systemoutprintln("客户下线了");
}
catch(EOFException e){
Systemoutprintln("Client closed");
}
catch (Exception e){
//eprintStackTrace();
}
finally{
try {
if(dis !=null) disclose();
if(dos !=null) dosclose();
if(s!=null) sclose();
} catch (Exception e1) {
// TODO 自动生成 catch 块
//e1printStackTrace();
}
}
}
}
}
第一个是客户端,
第二个是server端

Java游戏开发要学什么?所谓的游戏开发编程语言其实有很多,基本上任何一种语言都可以作为游戏服务器的编程语言。这需要根据自己游戏的类型和要求加以选择。比如C++,Java,Erlang,go等等。目前我用过的只有C++和Java但是以Java为主。所以接下来就以自己的经验,谈谈以Java为核心的游戏服务器开发技术体系。

Java目前作为游戏服务器开发语言已经很是普遍。但是大多数是作为页游或手游的服务器,而端游戏一般选择C++,因为端游对服务器的性能要求相对比较高一些。两种语言各有利弊。C++效率高,但是掌握度难些。没有Java易于掌握。而目前对于追求快速上线率的页游和手游来说,Java成了一个不错的选择。

一、Java的技术系统

需要学习的技术:

(1)Java基础知识

(2)JavaNIO编程

(3)Netty,Mina网络框架精通一种,其它作为了解。

(4)一种缓存框架:Redis;memcache熟悉使用一个。

(5)SQL语言,用于数据库:mysql数据库

(6)springmvc主要用于>

(7)多线程编程,明白线程安全的重要性。

(8)Java并发集合的掌握。

(9)Linux常用的基本命令及shell脚本。

(10)数据库 *** 作,比如mybatis。

以Java为服务器编程语言来说,掌握Java的基本知识就不必说了,是必不可少的。可以参考《Java编程思想》,《Java核心技术》等书。根据游戏通信协议的不同,大致有两种实现方式:Socket和>

二、学习流程

当然了,学习这些东西并不是一蹴而就的。需要根据实践循环渐进,这里推荐一个学习流程:

(1)对于初学Java的人来说,如果自学能力好些,可以买些书自己练习,而现在又更的多选择参加Java培训机构,以快速的掌握Java的知识。

(2)掌握了Java知识之后,要多写代码实践。这个时候可以结合mysql学习SQL语言,掌握数据库的 *** 作。比如用springmvc写一个小网站,用mybatis实现网站数据的增,删,改,查等功能。

(3)完成上步之后,可以在服务器程序和数据库之间加一个缓存,学习redis或memcache。

(4)把程序部署到linux服务器上,练习linux的基本命令及shell脚

免责声明:内容来源于公开网络,若涉及侵权联系尽快删除!

首先,TCP是流协议,数据没有边界。在整个通信过程中,连接从SYN-FIN之间发送的数据,接收方是无法判断发送方是否发送完全的。这样,数据包的定义就如应用层来处理了,典型的封包方式有:1,按数据长度。2,根据特殊字符。另外,TCP的传输与应用层的write还是不同步的,应用层的write是将应用数据发送到socket的send_q中,虽然write调用返回,但是应用数据还是本方socket的send_q中,并没有发送到对方。同样,即使在真正的传输中,本方的数据也不一定全部发送到接收方,这收到接收方当前的状态影响,比如说应用进行是否立即读取了数据。这里就存在滑动窗口之类的机制了。这种情况就会产生应用数据的粘包和拆包的问题。好了,先说这么多。

gdispose(); try{ ImageIOwrite(image,"JPEG",os); }catch(Exception 太奇怪,我测试了一下你的代码,很好用阿,采用两种方式都没有问题直接访问


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zz/13430156.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-04
下一篇 2023-08-04

发表评论

登录后才能评论

评论列表(0条)

保存