java客户端与服务器 java 服务器

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

以前写的,照贴了。。。服务器端:import java.awt.*;\x0d\x0aimport java.awt.event.WindowAdapter;\x0d\x0aimport java.awt.event.WindowEvent;\x0d\x0aimport java.io.*;\x0d\x0aimport java.net.*;/*6、采用UDP协议,编写一个Java网络应用程序,该应用分服务器端程序和客户端程序两部分。\x0d\x0a*客户端指定一个服务器上的文件名,让服务器发回该文件的内容,或者提示文件不存在。\x0d\x0a*(20分)(服务端程序和客户端程序分别命名为Server.java和Client.java)*/\x0d\x0apublic class N4BT6 extends Frame\x0d\x0a{\x0d\x0aDatagramSocket socket;\x0d\x0aDatagramPacket packet;byte[] buf;\x0d\x0aFile file;\x0d\x0aFileInputStream input;\x0d\x0aString message="该文件不存在";\x0d\x0aTextArea text;\x0d\x0apublic N4BT6(String title)\x0d\x0a{\x0d\x0asuper(title);\x0d\x0atext= new TextArea(6,4);\x0d\x0aadd(text);\x0d\x0asetSize(400, 300);\x0d\x0asetVisible(true);\x0d\x0aaddWindowListener(new WindowAdapter()\x0d\x0a{\x0d\x0apublic void windowClosing(WindowEvent e)\x0d\x0a{\x0d\x0adispose();\x0d\x0a}\x0d\x0a});\x0d\x0a\x0d\x0abuf= new byte[1024];\x0d\x0atry\x0d\x0a{\x0d\x0asocket= new DatagramSocket(1230);\x0d\x0apacket= new DatagramPacket(buf, buf.length);\x0d\x0asocket.receive(packet);\x0d\x0afile= new File(new String(packet.getData()));\x0d\x0asocket= new DatagramSocket();\x0d\x0a} \x0d\x0acatch(Exception e)\x0d\x0a{e.printStackTrace();\x0d\x0a}\x0d\x0a\x0d\x0aif(file.exists())\x0d\x0a{\x0d\x0atry\x0d\x0a{\x0d\x0abuf= new byte[(int)file.length()];\x0d\x0apacket= new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),1234);\x0d\x0ainput= new FileInputStream(file);\x0d\x0ainput.read(buf);\x0d\x0asocket.send(packet);\x0d\x0a}\x0d\x0acatch(IOException e) \x0d\x0a{\x0d\x0ae.printStackTrace();\x0d\x0a}\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0atry\x0d\x0a{\x0d\x0apacket= new DatagramPacket(message.getBytes(),message.getBytes().length,\x0d\x0aInetAddress.getLocalHost(),1234);\x0d\x0asocket.send(packet);\x0d\x0a}\x0d\x0acatch(Exception e) \x0d\x0a{\x0d\x0ae.printStackTrace();\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0a}\x0d\x0apublic static void main(String[] args)\x0d\x0a{\x0d\x0anew N4BT6("Server");\x0d\x0a}\x0d\x0a}\x0d\x0a客户端:import java.awt.*;\x0d\x0aimport java.awt.event.*;\x0d\x0aimport java.net.DatagramPacket;\x0d\x0aimport java.net.DatagramSocket;\x0d\x0aimport java.net.InetAddress;public class N4BT6_2 extends Frame\x0d\x0a{\x0d\x0aTextArea text;\x0d\x0aString message="Q.txt";\x0d\x0aDatagramSocket socket;\x0d\x0aDatagramPacket packet;\x0d\x0abyte[] buf;\x0d\x0apublic N4BT6_2(String title)\x0d\x0a{\x0d\x0asuper(title);\x0d\x0atext= new TextArea(6,4);\x0d\x0aadd(text);\x0d\x0asetSize(400, 300);\x0d\x0asetVisible(true);\x0d\x0aaddWindowListener(new WindowAdapter()\x0d\x0a{\x0d\x0apublic void windowClosing(WindowEvent e)\x0d\x0a{\x0d\x0adispose();\x0d\x0a}\x0d\x0a});\x0d\x0atry\x0d\x0a{\x0d\x0a\x0d\x0asocket= new DatagramSocket();\x0d\x0apacket= new DatagramPacket(message.getBytes(),message.getBytes().length,\x0d\x0aInetAddress.getLocalHost(),1230);\x0d\x0asocket.send(packet);\x0d\x0a}\x0d\x0acatch(Exception e) \x0d\x0a{\x0d\x0ae.printStackTrace();\x0d\x0a}\x0d\x0a\x0d\x0atry\x0d\x0a{\x0d\x0abuf= new byte[1024];\x0d\x0asocket= new DatagramSocket(1234);\x0d\x0apacket= new DatagramPacket(buf,buf.length);\x0d\x0asocket.receive(packet);\x0d\x0atext.append(new String(buf));\x0d\x0a}\x0d\x0acatch(Exception e) \x0d\x0a{\x0d\x0ae.printStackTrace();\x0d\x0a}\x0d\x0a}\x0d\x0apublic static void main(String[] args)\x0d\x0a{\x0d\x0anew N4BT6_2("Client");\x0d\x0a}\x0d\x0a}

在java中怎么将一组数据从客户端发送到服务器端

通过反射!

下面是一个服务器与客户端信息交互的例子:

反射API介绍

4.Java Socket编程 TCP协议编程

1) TCP工作模型:先找

堂(主机/IP),到食堂以后找窗口

(Socket/套接字端口号),服务员等待连接,客户向服务员发起连接

连接以后,一个窗口可以为每个客户安排一个服务员(线程)提供服务,

每个服务过程可以双向交流通讯(流),通讯完成后要关闭连接.

5. TCP服务端编程(食堂)(java.io.*,java.net.*,java.lang.*)

1)创建ServerSocket实例绑定一个服务端口(Socket/套接字端口号)

2)开始ServerSocket实例的监听,等待客户端的连接

3)如果有客户连接进来,就获得了客户的套接字(Socket)实例

客户的套接字(Socket)实例中包括与客户端建立的连接流

4)为这个客户(Socket)创建一个服务线程,提供服务(run方法)

5)继续等待下一个连接,返回到2)

6)服务线程完成通讯服务过程

7)端口号: 0~65535, 1K以下留给系统使用

6. TCP客户端编程

1)创建Socket实例,连接到服务器端,成功创建s就表示连接到了

服务器

Socket s= new Socket("host", port)

2)客户端 Socket与服务器端 Socket对应,都包含输入,输出流

客户端的s.getInputStream()连接于服务器s.getOutputStream()

客户端的s.getOutputStream()连接于服务器s.getInputStream()

3)使用线程处理网络流

7. Java反射

1)反射是Java自我管理(类,对象)的机制

2)*可以通过反射机制发现对象的类型发现类型的方法/属性/构造器

3)* Java反射可以创建对象并访问任意对象方法和属性等

4) Class加载

类加载到内存: java将磁盘类文件加载到内存中,为一个对象(实例)

这个对象是Class的实例,也就是这些对象都是Class实例

5)Class实例代表Java中类型,基本类型的类型: int.class, long.class

类类型 Class实例获得如下:

Class cls= String.class;

Class cls= Class.forName("java.lang.String");

Class cls="abc".getClass();

以上方法获得cls是同一个对象,就是String类内存加载的结果

package javase2.day06.ftp;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.util.Scanner;/*** ftp客户端可以使用命令 ls pwd get*/public class FtpClient{ public static void main(String[] args) throws IOException{ FtpClient client= new FtpClient(); client.open();} public void open() throws IOException{ Socket s= new Socket("localhost", 9000); InputStream in= s.getInputStream(); OutputStream out= s.getOutputStream();//处理客户端对服务器的请求 new RequestProcess(out).start();//处理服务器的反馈信息 new ResponseProcess(in).start();}//处理客户端对服务器的请求 class RequestProcess extends Thread{ OutputStream out; public RequestProcess(OutputStream out){ this.out= out;} public void run(){ try{ Scanner sc= new Scanner(System.in); while(true){ String s= sc.nextLine(); IOUtils.println(out, s); if(s.equals("bye")){ System.exit(0);}}}catch(IOException e){ e.printStackTrace();}}} class ResponseProcess extends Thread{ InputStream in; public ResponseProcess(InputStream in){ this.in= in;} public void run(){ try{ while(true){ String header= IOUtils.readLine(in); if(header.startsWith("text,")){ show(header,in);}else if(header.startsWith("file,")){ save(header, in);}}}catch(IOException e){ e.printStackTrace();}}} public void show(String header, InputStream in) throws IOException{ int n= Integer.parseInt(header.split(",")[1]); for(int i=0; i<n; i++){ String s= IOUtils.readLine(in); System.out.println(s);}} public void save(String header, InputStream in) throws IOException{ File dir= new File("ftp"); if(!dir.exists()){ dir.mkdir();}//header: file,10,filename String[] data= header.split(","); long length= Long.parseLong(data[1]); String filename= data[2]; File file= new File(dir, filename); BufferedOutputStream out= new BufferedOutputStream( new FileOutputStream(file)); for(long i=0; i<length; i++){ int b= in.read(); out.write(b);} out.close();}}-----------------------------------package javase2.day06.ftp;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;/***模拟FTP服务器,支持命令pwd,ls,get file**协议: type,length,value TLV格式**文本: text,5\nline1\nline2\nline3\nline4\nline5\n*文件: file,4,filename\n 41 42 43 44** text,5\nline1\nline2\nline3\nline4\nline5\nfile,4,filename\n 41 42 43 44*/public class FtpServer{ public static void main(String[] args) throws IOException{ FtpServer server= new FtpServer(); server.start();} public void start() throws IOException{ ServerSocket ss= new ServerSocket(9000); while(true){ Socket s= ss.accept(); new Agent(s).start();}} class Agent extends Thread{ Socket s; public Agent(Socket s){ this.s= s;} public void run(){ try{ InputStream in= s.getInputStream(); OutputStream out= s.getOutputStream();//向客户端发送,先发协议头,再发送文本行 out.write("text,1\n".getBytes());//协议头//发送消息内容,一行文本消息 out.write("欢迎使用FTP演示服务器!\n".getBytes()); out.flush(); while(true){//读取客户端发送到命令 String cmd= IOUtils.readLine(in).trim(); if("pwd".equals(cmd)){//显示当前目录 pwd(out);}else if("ls".equals(cmd)){ ls(out);}else if(cmd.startsWith("get")){ get(cmd, out);}else if("bye".equalsIgnoreCase(cmd)){ IOUtils.println(out,"text,1"); IOUtils.println(out,"Bye, Bye!"); s.close();}else{ out.write("text,1\n".getBytes());//协议头 out.write("只支持pwd,ls,get,bye!\n".getBytes()); out.flush();}}}catch(IOException e){ e.printStackTrace();}}} public void pwd(OutputStream out) throws IOException{ File dir= new File("."); IOUtils.println(out,"text,1"); IOUtils.println(out, dir.getCanonicalPath());} public void ls(OutputStream out) throws IOException{ File dir= new File("."); File[] files= dir.listFiles(); IOUtils.println(out,"text,"+files.length); for(File f: files){ if(f.isDirectory()){ IOUtils.println(out,"["+f.getName()+"]");}else{ IOUtils.println(out, f.getName());}}} public void get(String cmd, OutputStream out) throws IOException{//cmd="get filename" String name= cmd.split("\\s+")[1]; File file= new File(name); if(! file.exists()){ IOUtils.println(out,"text,1"); IOUtils.println(out,"没有文件呀!"+name); return;}//文件协议头: IOUtils.println(out,"file,"+file.length()+","+name); FileInputStream in= new FileInputStream(file); IOUtils.cp(in, out); out.flush(); in.close(); IOUtils.println(out,"text,1"); IOUtils.println(out,"发送成功:"+name);}}

服务器端和客户端的区别在哪

区别是两者的服务对象不同。服务器端是为客户端服务的,客户端就是为真正的“客户”来服务的,所以这两者之间不同,但又密切相连,客户端是请求方或者说是指令发出方,而服务器端是响应方。

1、客户端:在web中是以request对象存在的,发送请求给服务器端处理,具体的使用方法可以查找javaee的servletrequest以及其子类。

2、服务端:顾名思义是服务的,客户端发送的请求交给服务器端处理,是以response对象存在,服务器端处理完毕后反馈给客户端。

3、一般我们访问网站,都是客户端(浏览器、app)发出请求,然后对方服务器端(sina,sohu)响应,结果就是返回了页面路径给我们,我们再根据路径看到了网页。

扩展资料:

客户端与服务器端的通信过程

1、通信首先需要进行通信的实体

电脑&&文件服务器(可能是台功能强大的电脑),电脑&&打印机。

2、然后是通信的媒介

如上面例子中用到的电缆或光缆,当然也可能是介于某一频谱范围内的看不见的无线电波。

3、最关键的是通信协议

电脑要和打印机交流,必须要规定通信的规矩,即协议(电脑发送一段数据过去,也许就是一个符号'Y',但打印机需要明白这是要打印的意思,所以他们事先要规定好什么是什么的意思,才不会出现对牛弹琴的现象)。

当然,协议的种类非常多。信息从电脑发出到文件服务器,就进过了许多的协议。本来是一段文字,经过某种协议被转化成能在媒介中传递的电信号或电磁波等信号,这些信号要达到文件服务器那一端,中途可能会碰到一系列的节点(能接受信息并做出处理的系统,如路由器)。

节点会按照某种协议告诉这些信号该怎样走才能到达文件服务器,然后信号开始沿着该节点告诉他的方向继续传递(要知道互联网的线路可是比蜘蛛网复杂的多,没有中间一系列节点的帮助,要达到目的地都是很不容易的)。

最好要到达目的地时,要按照协议将电信号或电磁波信号转换为文件服务器能识别的信息。意思大概就是这样,如果想知道具体什么协议的话,就需要查看相关文献了,重中之重莫过于TCP/IP协议了。

参考资料:

百度百科-服务器端

百度百科-客户端

阅读剩余
THE END