ch33 实验十七 网络编程一Socket通信Word文档格式.docx
《ch33 实验十七 网络编程一Socket通信Word文档格式.docx》由会员分享,可在线阅读,更多相关《ch33 实验十七 网络编程一Socket通信Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
端口"
),返回ServerSocketConnection
3.如果有客户端连接上来,可以用ServerSocketConnection.accepteAndOpen()返回SocketConnection
SocketConnection重要方法:
1.getAddress():
2.openDataInputStream/openInputStream:
打开输入流
3.openDataOutputStream/openOutputStream:
打开输出流
案例1:
客户端与服务器端建立连接
●ClientMIDlet1.java文件
importjavax.microedition.io.Connector;
//客户端
publicclassClientMIDlet1extendsMIDlet{
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{}
protectedvoidpauseApp(){}
protectedvoidstartApp()throwsMIDletStateChangeException{
try{
Connector.open("
//127.0.0.1:
9999"
);
}catch(Exceptionex){
ex.printStackTrace();
}
}
}
●ServerMIDlet1.java文件
importjavax.microedition.io.ServerSocketConnection;
//服务器端
publicclassServerMIDlet1extendsMIDlet{
publicServerMIDlet1(){}
//监听某个端口
ServerSocketConnectionssc
=(ServerSocketConnection)Connector.open("
//等待客户端连接,如果没有客户端连接,程序在这里阻塞
System.out.println(ssc.getLocalAddress());
//获取IP地址
System.out.println(ssc.getLocalPort());
//获取端口号
ssc.acceptAndOpen();
}catch(Exceptionex){ex.printStackTrace();
案例2:
客户端与服务器端建立连接.
客户端向服务器端发送“Hello”,服务器端向客户端发送“Welcometojoinus”
●ClientMIDlet2.java文件
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjavax.microedition.io.SocketConnection;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
publicclassClientMIDlet2extendsMIDlet{
//连接到服务器端,连接成功,返回的SocketConnection充当通信桥梁
SocketConnectionsc
=(SocketConnection)Connector.open("
/*以后就可以通过sc与服务端通信*/
DataOutputStreamdos=sc.openDataOutputStream();
//输出信息
dos.writeUTF("
Hello"
DataInputStreamdis=sc.openDataInputStream();
Stringmsg=dis.readUTF();
System.out.println(msg);
●ServerMIDlet2.java文件
publicclassServerMIDlet2extendsMIDlet{
publicServerMIDlet2(){}
//等待客户端连接,如果有客户端链接,acceptAndOpen方法返回的StreamConnection强制转换为SocketConnection充当通信桥梁
SocketConnectionsc=(SocketConnection)ssc.acceptAndOpen();
/*以后就可以通过sc与客户端通信*/
System.out.println("
客户端:
"
+sc.getAddress());
Welcometojoinus"
}
案例3:
简单聊天室程序(未经过优化,会抛出异常)
●ChatClientMIDlet.java文件//优化之前文件
publicclassChatClientMIDletextendsMIDletimplementsCommandListener{
privateSocketConnectionsc=null;
//*********①
privateCommandcmdSend=newCommand("
发送"
Command.SCREEN,1);
privateFormfrmChat=newForm("
聊天界面"
privateTextFieldtfMsg=newTextField("
输入聊天信息"
"
255,TextField.ANY);
privateDisplaydisplay;
display=Display.getDisplay(this);
display.setCurrent(frmChat);
frmChat.addCommand(cmdSend);
frmChat.append(tfMsg);
frmChat.setCommandListener(this);
sc=(SocketConnection)Connector.open("
//*********②
newReceiveThread().start();
publicvoidcommandAction(Commandc,Displayabled){
if(c==cmdSend){
try{
DataOutputStreamdos=sc.openDataOutputStream();
//*********③
dos.writeUTF(tfMsg.getString());
}catch(Exceptionex){
//ex.printStackTrace();
}
classReceiveThreadextendsThread{
publicvoidrun(){
while(true){
try{
DataInputStreamdis=sc.openDataInputStream();
//*********④
Stringmsg=dis.readUTF();
frmChat.append(msg+"
\n"
}catch(Exceptionex){
ex.printStackTrace();
}
}
●ChatServerMIDlet.java文件//优化之前文件
importjavax.microedition.lcdui.Command;
importjavax.microedition.lcdui.CommandListener;
importjavax.microedition.lcdui.Display;
importjavax.microedition.lcdui.Displayable;
importjavax.microedition.lcdui.Form;
importjavax.microedition.lcdui.TextField;
publicclassChatServerMIDletextendsMIDletimplementsCommandListener{
privateServerSocketConnectionssc=null;
//*********⑤
ssc=(ServerSocketConnection)Connector.open("
sc=(SocketConnection)ssc.acceptAndOpen();
//*********⑥
//*********⑦
//*********⑧
优化方式:
删除③④⑦⑧处代码
在①⑤处添加代码:
privateDataInputStreamdis=null;
privateDataOutputStreamdos=null;
在②⑥处添加代码:
dis=sc.openDataInputStream();
dos=sc.openDataOutputStream();
聊天室程序
1.ChatServerMIDlet
importjava.io.*;
importjavax.microedition.io.*;
importjavax.microedition.lcdui.*;
importjavax.microedition.midlet.*;
privatebooleanrun=true;
dis=sc.openDataInputStream();
dos=sc.openDataOutputStream();
publicvoidcommandAction(Commandc,Displayabled){
}catch(Exceptionex){}
while(run){
try{
}catch(Exceptionex){ex.printStackTrace();
}
close();
publicvoidclose(){
dos.close();
dis.close();
sc.close();
ssc.close();
}catch(Exceptionex){}
ChatClientMIDlet
…………
importexample1.ChatServerMIDlet.ReceiveThread;
protecte