//==============Server.java=================//
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket s = new ServerSocket(12345);
System.out.println("服务器就绪,请启动客户端.");
Socket so = s.accept();
byte[] buff = new byte[1024];
int read = so.getInputStream().read(buff);
String[] abc=new String(buff,0,read).split("\\D+");
int a = Integer.parseInt(abc[0]);
int b = Integer.parseInt(abc[1]);
int c = Integer.parseInt(abc[2]);
if(!cbt(a,b,c))
so.getOutputStream().write("输入的数据无法组成三角形.".getBytes());
else
so.getOutputStream().write(getArea(a,b,c).getBytes());
so.getOutputStream().flush();
so.close();
s.close();
}
private static String getArea(int a, int b, int c) {
float s = (a+b+c)/2f;
return "面积: "+Math.sqrt(s*(s-a)*(s-b)*(s-c));
}
private static boolean cbt(int a, int b, int c) {
return a>0&&b>0&&c>0&&a+b>c&&b+c>a&&a+c>b;
}
}
//=================Client.java======================//
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("输入三角形的三边并用逗号隔开,如: (3,4,5) ");
byte[] buff=new byte[64];
int r = System.in.read(buff);
String ipaddr = "localhost";//根据情况改变,在本机调试就不改了
Socket so = new Socket(ipaddr,12345);
so.getOutputStream().write(new String(buff,0,r).getBytes());
r = so.getInputStream().read(buff);
so.close();
String rs = new String(buff,0,r);
System.out.println(rs);
}
}
//先启动Server,再启动Client
㈡ 有过java socket网络编程经验的人进来指导下
这两个问题都可以通过消息机制来解决,
消息机制就是双方约定的通信语言。
首先:你需要自定义一份双方约定的通信机制,
其次: 对每个连进来的客户按用户ID或IP进行编号存入哈希表,以方便索引用户的Socket通道。 每进来一个客户就 hashtable.put(user.name, socket);
最后:双方都还要有两个缓冲数组(可以是数组Object[],也可以是Vector,Arraylist,Hashtable都可以);
一个叫发送缓冲区,一个叫接收缓冲区。每一个都附带一个管理线程。
向客户端发送消息时,并不是马上就发送,而是将消息推入到发送缓冲区排队,
发送缓冲区的线程会每隔一小片时间后就扫描并 pop出一个可发送的消息。
分析这个消息的源发送者和目的发送者,然后hashtable的索引找到目的发送者的socket通道。并发送.
另一个叫接收缓冲区。 Socket的网络线程不断接收到客户的消息,但不是马上就处理,也不会自己亲自处理,而是压入接收缓冲队列等待缓冲队列来处理,自己休息片段又立马再去接收别的客户发过来的消息。 接收缓冲区有自己的线程,它每sleep一小片刻时间后就扫描队列中有无消息到达,如果有(网络线程刚压进一的),则可以采用监听器模式让监听器处理,如果不想那么复杂也可以自己处理, 会分析消息来源和去向,从去向中分析出将要发送给某人,但自己并不发送,而是直接压入到发送缓冲区(这里就接到前面的发送缓冲区介绍中去了)
最后是消息机制的设计。
我公司的游戏都是由我来设计通信机制,实现三网合一,即手机,PC,电视机顶盒三种客户端同玩一桌麻将游戏
一般java设计的游戏中设计如下:
一. 消息头 二.消息体
消息头设计格式如下: 1. 本消息包长度,以方便解析字节;2. 本消息类型TYPE:如一般消息,游戏消息,大厅消息,聊天消息;3.本消息命令类型COMMAND: 如登陆、个人资料修改、登出、聊天。。。。
消息体设计格式一般根据Type和command不同而有不同。 如聊天消息包含四个字段,String 聊天内容、 User 发送者、 User 接收者、Text文字排版信息
服务端SeverSocket收到这个消息后,压入接收缓冲区, 接收缓冲线程分析其中结构,根据Type和Command的类型实例化出相应消息类, 该消息类能自动将后面的字节流实例化自身的字段。从而得到接收方和发送方, 得到接收方后再将消息封装好压入到发送队列
这个结构除完全适合聊天系统以外,以后要加入新内容将会非常容易!
如果有什么疑问欢迎call我, 我不负责写代码,但可以指点你。 另外,我的回答记录中有用nio设计的聊天室BBS代码。也是帮一个学生做的。你可以看看
㈢ java中socket是网络编程,jsp也是网络编程 (1)他们有什么联系和区别 (2)jsp底层的实现使用socket吗
1。socket是网络数据传输层主要技术手段,要传递网络信息的大都是靠socket实现的。
2.jsp在是这么传输数据的:先转换成servlet,再编译为.class字节码servlet 底层是 socket,jsp所转化的servlet是HttpServlet,它是对http 协议的封装 。你可以去web服务器比如tomcat下的work文件夹看看,里面都是jsp转换的servelt以及他们的字节码.class文件。
总的来说呢,底层到高层这么来的:
socket->HttpServlet->JSP
所以你非要说jsp底层是有socket实现的也没错。
㈣ java中什么是socket编程
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
㈤ java网络编程包含些什么
java网络编程通常包括三部分TCP/IP , UDP ,URL ;socket只是其中的一个套接字。web,jsp与上面一点关系也没有,上面是j2se的内容。下面则是j2ee内容。web是一个服务,而jsp是一种技术。实在找关系的话,web包括了jsp.
㈥ 浅谈Java中如何利用socket进行网络编程(一)
Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上的数据的传递。在java中,有专门的socket类来处理用户的请求和响应。利用SOCKET类的方法,就可以实现两台计算机之间的通讯。这里就介绍一下在JAVA中如何利用socket进行网络编程。 在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。 程序可以对这些数据流根据需要进行进一步的封装。本文的例子就对这些数据流进行了一定的封装(关于封装可以参考Java中流的实现部分)。 一、建立服务器类 Java中有一个专门用来建立Socket服务器的类,名叫ServerSocket,可以用服务器需要使用的端口号作为参数来创建服务器对象。ServerSocket server = new ServerSocket(9998) 这条语句创建了一个服务器对象,这个服务器使用9998号端口。当一个客户端程序建立一个Socket连接,所连接的端口号为9998时,服务器对象server便响应这个连接,并且server.accept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。Socket incoming = server.accept() 进而得到输入流和输出流,并进行封装BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream())); PrintWriter out = new PrintWriter(incoming.getOutputStream(),true); 随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。
㈦ java中面向网络编程的问题Socket Serversocket
错误在客户端
写出数据的时候
要
flush()一下
String
str="用户:tom,登录的密码是123";
pw.write(str);
在这个后面加个
pw.flush();
㈧ java Socket网络编程
调用 outt.flush ();