JAVA服务端android客户端如何通信

JAVA服务端android客户端如何通信,第1张

一、>服务器端代码:
import javaioBufferedReader;
import javaioIOException;
import javaioInputStreamReader;
import javaioPrintStream;
import javanetServerSocket;
import javanetSocket;
/
Socket通讯服务器
@author 米强

/
public class ServerMain {
public ServerMain() {
try {
// 构造服务器ServerSocket对象,参数为服务器端开放的端口号
ServerSocket ss = new ServerSocket(30102);
Systemoutprintln("服务器准备就绪!");
// 死循环可以使服务器持续处于接收客户端状态
while(true){
// 该方法使程序阻塞,等待客户端的链接,当监听到客户端的链接,创建一个Socket对象与客户端单独会话
Socket s = ssaccept();
// 为了不影响服务器监听其它客户端,这里开启了一个线程,由线程处理与这个客户端的会话
new ServerThread(s)start();
}
} catch (IOException e) {
eprintStackTrace();
}
}
public static void main(String[] args) {
new ServerMain();
}
}
/
服务器端与客户端会话的线程
/
class ServerThread extends Thread {
private Socket s = null;
private BufferedReader read = null;
private PrintStream print = null;
public ServerThread(Socket s) {
thiss = s;
try {
// 从Socket中获取输入流和输出流,由于我们只做一个简单的字符串通讯,所以采用BufferedRead和PrintStream来封装输入、输出流
read = new BufferedReader(new InputStreamReader(sgetInputStream()));
print = new PrintStream(sgetOutputStream());
} catch (IOException e) {
eprintStackTrace();
}
}
/
线程的运行run方法
/
public void run() {
try {
String message = null;
// 这里循环可以使服务器持续的接收客户端信息。readreadLine()通过输入流读取一段字符串,赋值给message变量,如果message字符串不为“exit”则循环,否则结束循环
while (!(message = readreadLine())equals("exit")){
// 将字符串前面添加“返回:”,再发回客户端
printprintln("返回:" + message);
}
} catch (IOException e) {
} finally {
// 在 finally 代码块中无论如何都会执行下面代码:
try {
// 如果没有关闭Socket
if(!sisClosed()){
// 关闭Socket链接
sclose();
}
} catch (IOException e1) {
e1printStackTrace();
}
}
}
}
客户端代码:
import javaioBufferedReader;
import javaioIOException;
import javaioInputStreamReader;
import javaioPrintStream;
import javanetSocket;
import javanetUnknownHostException;
import javautilScanner;
/
Socket通讯客户端
@author 米强

/
public class ClientMain {
public ClientMain() {
try {
// 构造与服务器通讯的Socket对象,参数为服务器IP地址(String)和端口号(int),端口号需要和服务器端开放的端口号对应
Socket s = new Socket("1921681100", 30102);
// 启动一个线程与服务器通讯,并把链接服务器的Socket对象传递过去
new LinkThread(s)start();
} catch (UnknownHostException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
}
public static void main(String[] args) {
new ClientMain();
}

}
/
与服务器通讯的线程
/
class LinkThread extends Thread {
private Socket s = null;
// 输出流
private PrintStream out = null;
// 缓冲输入流
private BufferedReader in = null;
// 录入文字的Scanner对象
private Scanner scanner = null;

public LinkThread(Socket s) {
// 将Socket对象实例保存在全局变量中,因为run方法中我们还要用它断开链接
thiss = s;
try {
// 从Socket中获取输入流和输出流,由于我们只做一个简单的字符串通讯,所以采用BufferedRead和PrintStream来封装输入、输出流
out = new PrintStream(sgetOutputStream());
in = new BufferedReader(new InputStreamReader(sgetInputStream()));
} catch (UnknownHostException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
}

/
线程的运行run方法
/
public void run() {
// 构造Scanner对象
scanner = new Scanner(Systemin);
Systemoutprintln("提示:如果要结束本次会话,请输入“exit”指令!");
try {
// 死循环可以使客户端不断的向服务器发送信息,不用担心循环无法结束,后面的return语句可以结束整个线程。
while(true){
// 提示用户输入文字
Systemoutprint("请输入:");
// 将用户输入的字符串保存在message变量中
String message = scannernextLine();
// 通过输出流发送字符串
outprintln(message);
// 清空缓冲,强制输出
outflush();
// 获取服务器返回的字符串
String str = inreadLine();
// 如果返回的字符串存在
if(str != null){
// 显示在控制台
Systemoutprintln(str);
}else{
// 提示会话结束,并结束线程
Systemoutprintln("本次会话结束!");
return;
}
}
} catch (IOException e) {
eprintStackTrace();
} finally {
// 在 finally 代码块中无论如何都会执行下面代码:
try {
// 如果没有关闭Socket
if(!sisClosed()){
// 关闭Socket链接
sclose();
}
} catch (IOException e1) {
e1printStackTrace();
}
}
}

}

我想你应该是想问C/S架构中的客户端和服务端
两者最常见的方式是通过Socket方式进行通信。

Socket可以理解成一个电线插座的工作过程:
服务器是电源插件, 客户端是电器
C和S通过电线和指定的插孔进行连接,连上后,S将电力源源不断发送到C, C就可以工作了。 当然C也可以反向发送信息到S。 两者可以相互通信。

在建立的过程中代码有一些不同。
在服务端采用API类是ServerSocket
在客户端采用的API是Socket类

连接建立后,双方都通过连接获取输入和输出流从而实现通信。即: InputStream is=socketgetInputStream();
isread();

连接代码:
S端:
ServerSocket server=null;
try {
server=new ServerSocket(指定的端口);
}catch(Exception e){
Systemoutprintln("不能监听:"+etoString());
}
Socket socket=null;
try {
socket=serveraccept();
InputStream is=socketgetInputStream();
//己通过建立起流,可以读取客户端发来的请求了
//同样也可以发送能过 sokcetgetOutputStream()

}
catch(IOException e){
Systemoutprintln("出错:"+etoString());
}finally{
try {
if(socket!=null){
socketclose();
serverclose();
}
}
catch(IOException e){
eprintStackTrace();
}
}

客户端:
Socket socket=null;
try {
socket=new Socket(url,端口);
//获取输出流,从而向服务端发数据
socketgetOutputStream();
//获取输入流,从而可以读服务端的数据
socketgetInputStream();

}catch(Exception e){
eprintStackTrace();
}
finally{
try {
socketclose();
}
catch(IOException e){
eprintStackTrace();
}
}

打横杠是因为那个方法已经过时了现在已经不怎么用了。。。
Socket 服务器: 1先创建 ServerSocket ss = new ServerSocket(端口号)
2 接收请求 Socket s = ssaccept()
3接收消息 先读后写BufferedReader in = new BufferedReader(
new InputStreamReader(sgetInputStream(),"utf-8"));
String str = inreadLine(); PrintWriter out = new PrintWriter
( new BufferedWriter( new OutputStreamWriter(sgetOutputStream())),true);
outprintln("服务器信息");
4关闭流outclose();
inclose();
isclose();
客户端 1、通过IP地址和端口实例化Socket,请求连接服务器
2、获取Socket上的流以进行读写。
3、对流包装进BufferedReader/PrintWriters实例
4、关闭打开的流

右键点击网络Internet访问共享中心。
网络共享中心左下方导航处有个‘Windows 防火墙’,点击进入。
进入‘允许程序或功能通过windows防火墙’。
在允许的程序和功能下找到需要设置白名单的软件。如果没有,点击‘允许运行另一程序’。
选择程序,点击后路径会发现变化,转换到程序的路径中。把程序添加进来。
在家庭/工作专用和公用前面都打上勾,也可以按自己的需要去改变。最后保存方可。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存