java网络编程,怎样在客户端和服务器间实现通信。

java网络编程,怎样在客户端和服务器间实现通信。,第1张

写个简单点的服务器跟客服端就行了我写了个很简单的,只能在一个客户端跟一个服务器通信,在控制台输入下面这个是服务器import javaio;

import javanet;

import javautilScanner;public class Server

{

public static void main(String[] args)

{

try {

ServerSocket server=new ServerSocket(8888);//定义客户端的端口号

Socket client=serveraccept();//定义一个Socket对象

InputStream is=clientgetInputStream();//服务器接受信息输入流,也就是接受从服务器段发送过来的消息

BufferedReader br=new BufferedReader(new InputStreamReader(is));//用bufferedreader包装下输入流

OutputStream os=clientgetOutputStream();//这是用来给服务器发送消息的输出流

PrintStream ps=new PrintStream(os);

Scanner scanner=new Scanner(Systemin);//从键盘输入字符串

boolean flag=true;//定义一个死循环,让服务器不停的接受从客户端发送来的字符串

while(flag)

{

String s=brreadLine();//s是从客户端接受到得字符串

Systemoutprintln(s);

String s2=scannernextLine();//s2是写给客户端的字符串

psprintln(s2); //给客户端发送你写的东西

}

clientclose();

} catch (IOException e) {//try 跟catch你不用管,这是用来处理异常的,就是固定格式

eprintStackTrace();

}

}

} 下面是客户端import javaio;

import javanet;

import javautilScanner;public class Client

{ public static void main(String[] args)

{

try

{

Socket client=new Socket("192168----",8888);//IP地址是个字符串,端口号是个整数,这个端口号要跟前面你写的那个一样,还有IP地址,写你的机器的IP地址

InputStream is=clientgetInputStream();//这边的两个流跟上面服务器的差不多的作用

BufferedReader bf=new BufferedReader(new InputStreamReader(is));

OutputStream os=clientgetOutputStream();

PrintStream ps=new PrintStream(os);

Scanner scanner=new Scanner(Systemin);

boolean flag=true;

while(flag)//这句话可以让客户端不停的说话

{

String s2=scannernextLine();

psprintln(s2);

String s=bfreadLine();

Systemoutprintln(s); }

clientclose();

}

catch (UnknownHostException e)

{

eprintStackTrace();

}

catch (IOException e)

{

eprintStackTrace();

} }}

服务器告知双方对方的ip地址,并协调由哪一方主动连接。

如 协调结果是: 把c2的地址告诉c1,让c1主动连接c2,让c2打开端口等待连接。

要考虑认证问题,比如c2如何知道连接上来的是c1,而不是其他人,就需要有认证机制。

另外要考虑内网问题。由于从外部连接内网里面的IP地址是相当繁琐复杂的,所以需要特别的机制处理。

使用session机制,将参数动态的放在url后或使用cookies保存,将信息保存在url后或url链接后面。从服务器上再保存一份,就可以了。不过实现起来太复杂了。 暂不做介绍

现在有一个简单的办法就是可以在发送的消息前面加入一个随机值,当有新的请求到来的时候创建一个,然后保存起来。当客户端接收到这个随机值的时候,再回信息的时候将这个消息一并发给服务器。服务器可以这样判断,如果没有这个消息值的话就认为是一个新的用户,并为其创建一个消息。如果带有这消息的话,就是已经链接过的。这样就可以保持链接状态了。

你的不是B/S,B/S的意思是Browser(浏览器) Server(Web服务器),根据你的描述,你的客户端有3个类,服务端有2个类,是很明显的C/S模式,这个不需要建什么Web服务吧。

如果你想把你的程序运行起来,你首先要把服务端的代码执行起来,怎么执行?你把你服务端的两个类打成一个可执行的jar包(eclipse的export命令可以帮助你打可执行jar包),然后执行javaw -jar xxxxjar,把你的服务端程序跑起来。用同样的方式,把你的客户端程序跑起来就可以了。

import javanet;

import javaio;

public class Server {

public static void main(String[] args) throws IOException {

String s = "";//用stringbuffer试试

String s1 = "";

ServerSocket server = new ServerSocket(60000);

Systemoutprintln("可以开始通信");

try {

Socket socket = serveraccept();

Systemoutprintln(socket);

InputStream is = socketgetInputStream();

OutputStream out = socketgetOutputStream();

BufferedReader bfr = new BufferedReader(new InputStreamReader(is));

PrintWriter pw = new PrintWriter(new OutputStreamWriter(out));

BufferedReader br = new BufferedReader(new InputStreamReader(Systemin));

while (true) {

s = bfrreadLine();

Systemoutprintln("客户端对我说:" + s);//读取客户端信息并输出

if("bye"equals(s)) {

pwprintln("bye");

pwflush();

break;

}

s1 = brreadLine();

pwprintln(s1);

pwflush();

Systemoutprintln("我对客户端说:" + s1);

}

socketclose();

} catch (IOException e) {

eprintStackTrace();

}

serverclose();

}

class Reader extends Thread {

public void run() {

while (true) {

}

}

}

}

import javanet;

import javaio;

public class Talk {

static InputStream is = null;

static OutputStream out;

static BufferedReader bfr;

static PrintWriter pw;

static BufferedReader pin;

public static void main(String[] args) throws IOException {

Socket socket = new Socket(InetAddressgetByName("localhost"), 60000);

Systemoutprintln(socket);

try {

is = socketgetInputStream();

out = socketgetOutputStream();

bfr = new BufferedReader(new InputStreamReader(is));

pw = new PrintWriter(new OutputStreamWriter(out));

pin = new BufferedReader(new InputStreamReader(Systemin));

new Controlaa()start();

while (true) {

String s1 = bfrreadLine();

Systemoutprintln("服务器对我说:" + s1);//读取服务器端发送的信息

if (s1equals("bye")) {

break;

}

}

socketclose();

} catch (IOException e) {

eprintStackTrace();

}

}

static class Controlaa extends Thread {

@Override

public void run() {

while (true) {

String s = "";

try {

s = pinreadLine();

} catch (IOException ex) {

exprintStackTrace();

}

Systemoutprintln("我对服务器说:" + s);

pwprintln(s);

pwflush();

}

}

}

}

简单搞了下,读取控制台输入和读取socket都是阻塞操作

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » java网络编程,怎样在客户端和服务器间实现通信。

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情