「java处理tcp」Java处理异常的语句是什么?
今天给各位分享java处理tcp的知识,其中也会对Java处理异常的语句是什么?进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、java写tcp客户端测试类该怎么写
- 2、TCP/IP协议 怎么用JAVA发送和接收二进制数据 要具体实例
- 3、北大青鸟java培训:TCP/IP协议的一些基础知识?
- 4、java如何通过tcp向指定的IP发送指令并获得返回的包?
- 5、java如何通过tcp发送指令
java写tcp客户端测试类该怎么写
1.TCP服务端的程序编写
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class MyTcp{
private BufferedReader reader;
private ServerSocket serverSocket;
private Socket socket;
/**
* 创建服务端的程序,读取客户端传来的数据
*/
void getserver(){
try {
serverSocket = new ServerSocket(8998); //实例化服务端socket
System.out.println("服务器套接字已经创建成功");
while (true) {
System.out.println("等待客户机的连接:");
socket = serverSocket.accept(); //实例化socket对象
reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); //实例化BufferReader对象
getClientMessage();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void getClientMessage() {
try {
while (true) {
System.out.println("客户机传来的信息是:"+reader.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyTcp myTcp = new MyTcp(); //创建本类对象
myTcp.getserver();
}
}
2.TCP客户端程序编写
package test;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintWriter;
import java.net.Socket;
import java.nio.channels.WritableByteChannel;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
public class MyTcpClient extends JFrame{
private PrintWriter printWriter;
Socket socket;
private JTextField jTextField = new JTextField();
private JTextArea jTextArea = new JTextArea();
Container container;
/**
* 创建的Tcp客户端程序
*/
public MyTcpClient (String title) {
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
container = this.getContentPane();
final JScrollPane jScrollPane = new JScrollPane();
jScrollPane.setBorder(new BevelBorder(BevelBorder.RAISED)); //显示边框
getContentPane().add(jScrollPane,BorderLayout.CENTER);
jScrollPane.setViewportView(jTextArea);
container.add(jTextField,"South"); //将文本框放在窗体下面
jTextField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
printWriter.println(jTextField.getText()); //将文本框的信息写入流(为下面的输出流写入信息做准备)
jTextArea.append(jTextField.getText() + "\n");
jTextArea.setSelectionEnd(jTextArea.getText().length());
jTextField.setText(null);
}
});
}
private void connect() {
jTextArea.append("尝试连接中...\n");
try {
socket = new Socket("127.0.0.1",8998);
printWriter = new PrintWriter(socket.getOutputStream(),true); //将printwriter中的信息流写入到套接字的输出流传送给服务端
jTextArea.setText("已完成连接\n\n");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyTcpClient myTcpClient = new MyTcpClient("向服务器发送数据");
myTcpClient.setSize(500,200);
myTcpClient.setVisible(true);
myTcpClient.connect();
}
}
3.效果展示
1先将服务端的程序跑起来
2再将客户端的程序跑起来
3.客户端和服务端进行交互
TCP/IP协议 怎么用JAVA发送和接收二进制数据 要具体实例
1.TCP/IP协议要求信息必须在块(chunk)中发送和接收,而块的长度必须是8位的倍数,因此,我们可以认为TCP/IP协议中传输的信息是字节序列。如何发送和解析信息需要一定的应用程序协议。
2.信息编码:
首先是Java里对基本整型的处理,发送时,要注意:1)每种数据类型的字节个数;2)这些字节的发送顺序是怎样的?(little-endian还是
big-endian);3)所传输的数值是有符号的(signed)还是无符号的(unsigned)。具体编码时采用位操作(移位和屏蔽)就可以了。
具体在Java里,可以采用DataOutputStream类和ByteArrayOutputStream来实现。恢复时可以采用
DataInputStream类和ByteArrayInputStream类。
其次,字符串和文本,在一组符号与一组整数之间的映射称为编码字符集(coded character
set)。发送者与接收者必须在符号与整数的映射方式上达成共识,才能使用文本信息进行通信,最简单的方法就是定义一个标准字符集。具体编码时采用
String的getBytes()方法。
最后,位操作。如果设置一个特定的设为1,先设置好掩码(mask),之后用或操作;要清空特定一位,用与操作。
3.成帧与解析
成帧(framing)技术解决了接收端如何定位消息的首位位置的问题。
如果接收者试图从套接字中读取比消息本身更多的字节,将可能发生以下两种情况之一:如果信道中没有其他消息,接收者将阻塞等待,同时无法处理接收
到的消息;如果发送者也在等待接收端的响应消息,则会形成死锁(dealock);另一方面,如果信道中还有其他消息,则接收者会将后面消息的一部分甚至
全部读到第一条消息中去,这将产生一些协议错误。因此,在使用TCP套接字时,成帧就是一个非常重要的考虑因素。
有两个技术:
1.基于定界符(Delimiter-based):消息的结束由一个唯一的标记(unique
marker)指出,即发送者在传输完数据后显式添加的一个特殊字节序列。这个特殊标记不能在传输的数据中出现。幸运的是,填充(stuffing)技术
能够对消息中出现的定界符进行修改,从而使接收者不将其识别为定界符。在接收者扫描定界符时,还能识别出修改过的数据,并在输出消息中对其进行还原,从而
使其与原始消息一致。
2.显式长度(Explicit length):在变长字段或消息前附加一个固定大小的字段,用来指示该字段或消息中包含了多少字节。这种方法要确定消息长度的上限,以确定保存这个长度需要的字节数。
接口:
Java代码 import java.io.IOException; import java.io.OutputStream; public interface Framer { void frameMsg(byte [] message,OutputStream out) throws IOException; byte [] nextMsg() throws IOException; }
定界符的方式:
Java代码 import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class DelimFramer implements Framer { private InputStream in;//data source; private static final byte DELIMTER=(byte)'\n';//message delimiter public DelimFramer(InputStream in){ this.in=in; } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { //ensure that the message dose not contain the delimiter for(byte b:message){ if(b==DELIMTER) throw new IOException("Message contains delimiter"); } out.write(message); out.write(DELIMTER); out.flush(); } @Override public byte[] nextMsg() throws IOException { ByteArrayOutputStream messageBuffer=new ByteArrayOutputStream(); int nextByte; while((nextByte=in.read())!=DELIMTER){ if(nextByte==-1){//end of stream? if(messageBuffer.size()==0){ return null; }else{ throw new EOFException("Non-empty message without delimiter"); } } messageBuffer.write(nextByte); } return messageBuffer.toByteArray(); } }
显式长度方法:
Java代码 import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class LengthFramer implements Framer { public static final int MAXMESSAGELENGTH=65535; public static final int BYTEMASK=0xff; public static final int SHOTMASK=0xffff; public static final int BYTESHIFT=8; private DataInputStream in;// wrapper for data I/O public LengthFramer(InputStream in) throws IOException{ this.in=new DataInputStream(in); } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { if(message.lengthMAXMESSAGELENGTH){ throw new IOException("message too long"); } //write length prefix out.write((message.lengthBYTEMASK)BYTEMASK); out.write(message.lengthBYTEMASK); //write message out.write(message); out.flush(); } @Override public byte[] nextMsg() throws IOException { int length; try{ length=in.readUnsignedShort(); }catch(EOFException e){ //no (or 1 byte) message; return null; } //0=length=65535; byte [] msg=new byte[length]; in.readFully(msg);//if exception,it's a framing error; return msg; } }
北大青鸟java培训:TCP/IP协议的一些基础知识?
相信大家在学习互联网网页开发的时候应该接触过关于网络协议的一些知识点吧。
今天IT培训就来简单了解一下,关于TCP/IP协议的一些基础知识。
1.TCP/IP的具体含义从字面意义上讲,有人可能会认为TCP/IP是指TCP和IP两种协议。
实际生活当中有时也确实就是指这两种协议。
然而在很多情况下,它只是利用IP进行通信时所必须用到的协议群的统称。
具体来说,IP或ICMP、TCP或UDP、TELNET或FTP、以及HTTP等都属于TCP/IP协议。
他们与TCP或IP的关系紧密,是互联网必不可少的组成部分。
TCP/IP一词泛指这些协议,因此,有时也称TCP/IP为网际协议群。
互联网进行通信时,需要相应的网络协议,TCP/IP原本就是为使用互联网而开发制定的协议族。
因此,互联网的协议就是TCP/IP,TCP/IP就是互联网的协议。
2.数据包包、帧、数据包、段、消息以上五个术语都用来表述数据的单位,大致区分如下:包可以说是全能性术语;帧用于表示数据链路层中包的单位;数据包是IP和UDP等网络层以上的分层中包的单位;段则表示TCP数据流中的信息;消息是指应用协议中数据的单位。
每个分层中,都会对所发送的数据附加一个部,在这个部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。
通常,为协议提供的信息为包部,所要发送的内容为数据。
在下一层的角度看,从上一层收到的包全部都被认为是本层的数据。
3.数据处理流程①应用程序处理先应用程序会进行编码处理,这些编码相当于OSI的表示层功能;编码转化后,邮件不一定马上被发送出去,这种何时建立通信连接何时发送数据的管理功能,相当于OSI的会话层功能。
②TCP模块的处理TCP根据应用的指示,负责建立连接、发送数据以及断开连接。
TCP提供将应用层发来的数据顺利发送至对端的可靠传输。
为了实现这一功能,需要在应用层数据的前端附加一个TCP部。
③IP模块的处理IP将TCP传过来的TCP部和TCP数据合起来当做自己的数据,并在TCP部的前端加上自己的IP部。
IP包生成后,参考路由控制表决定接受此IP包的路由或主机。
④网络接口(以太网驱动)的处理从IP传过来的IP包对于以太网来说就是数据。
给这些数据附加上以太网部并进行发送处理,生成的以太网数据包将通过物理层传输给接收端。
java如何通过tcp向指定的IP发送指令并获得返回的包?
以下是一个展示java使用tcp通讯的简单例子,包括服务器和客户端代码:\x0d\x0a\x0d\x0a/**\x0d\x0a *TCPServer\x0d\x0a */\x0d\x0aimport java.io.*;\x0d\x0aimport java.net.*;\x0d\x0aclass TCPServer{\x0d\x0a public static void main(String[] args)throws IOException{\x0d\x0a ServerSocket listen = new ServerSocket(5050);\x0d\x0a \x0d\x0a Socket server = listen.accept();\x0d\x0a InputStream in = server.getInputStream();\x0d\x0a OutputStream out = server.getOutputStream();\x0d\x0a char c = (char)in.read();\x0d\x0a System.out.println("收到:" + c);\x0d\x0a out.write('s');\x0d\x0a \x0d\x0a out.close();\x0d\x0a in.close();\x0d\x0a server.close();\x0d\x0a listen.close();\x0d\x0a }\x0d\x0a}\x0d\x0a\x0d\x0a/**\x0d\x0a *TCPClient\x0d\x0a */\x0d\x0aimport java.io.*;\x0d\x0aimport java.net.*;\x0d\x0aclass TCPClient{\x0d\x0a public static void main(String[] args)throws IOException{\x0d\x0a Socket client = new Socket("127.0.0.1" , 5050);\x0d\x0a InputStream in = client.getInputStream();\x0d\x0a OutputStream out = client.getOutputStream();\x0d\x0a \x0d\x0a out.write('c');\x0d\x0a char c = (char)in.read();\x0d\x0a System.out.println("收到:" + c);\x0d\x0a out.close();\x0d\x0a in.close();\x0d\x0a client.close();\x0d\x0a }\x0d\x0a}
java如何通过tcp发送指令
以下是一个展示java使用tcp通讯的简单例子,包括服务器和客户端代码:
/**
*TCPServer
*/
import java.io.*;
import java.net.*;
class TCPServer{
public static void main(String[] args)throws IOException{
ServerSocket listen = new ServerSocket(5050);
Socket server = listen.accept();
InputStream in = server.getInputStream();
OutputStream out = server.getOutputStream();
char c = (char)in.read();
System.out.println("收到:" + c);
out.write('s');
out.close();
in.close();
server.close();
listen.close();
}
}
/**
*TCPClient
*/
import java.io.*;
import java.net.*;
class TCPClient{
public static void main(String[] args)throws IOException{
Socket client = new Socket("127.0.0.1" , 5050);
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream();
out.write('c');
char c = (char)in.read();
System.out.println("收到:" + c);
out.close();
in.close();
client.close();
}
}
java处理tcp的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于Java处理异常的语句是什么?、java处理tcp的信息别忘了在本站进行查找喔。
发布于:2022-12-21,除非注明,否则均为
原创文章,转载请注明出处。