java网络编程,怎样在客户端和服务器间实现通信。
写个简单点的服务器跟客服端就行了我写了个很简单的,只能在一个客户端跟一个服务器通信,在控制台输入下面这个是服务器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都是阻塞操作
0条评论