NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Prosím o pomoc

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
osm70
Člen
Avatar
osm70:27.4.2017 17:44

Zdravím,

nefunguje mi program. Měl by udělat registraci uživatele. Klient pošle na server zprávu a server ověří jestli účet už existuje a pokud ne, tak ho vytvoří(zápisem do databáze). Poté odešle klientovi zprávu s výsledkem a klient podle toho co přišlo zobrazí zprávu pro uživatele. (Například jméno obsazeno). Místo toho, to píše, že byl účet vyroben, i když už je jméno obsazeno, ale účet to opravdu udělá. Klient poté vyhodí vyjímku.

Client

/*

  • To change this license header, choose License Headers in Project Properties.
  • To change this template file, choose Tools | Templates
  • and open the template in the editor.

*/
package Client;

import java.io.IOExcep­tion;
import java.net.Inet­SocketAddress;
import java.nio.Byte­Buffer;
import java.nio.chan­nels.SocketChan­nel;
import java.util.log­ging.Level;
import java.util.log­ging.Logger;
import javax.swing.JOp­tionPane;

/**
*

  • @author osm70

*/
public class RegisterWindow extends javax.swing.JFrame {

/**
* Creates new form RegisterWindow
*/
public RegisterWindow() {
initComponents();
}

/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnin­gs("unchecked")
// <editor-fold defaultstate="co­llapsed" desc="Generated Code">
private void initComponents() {

jLabel1 = new javax.swing.JLa­bel();
jLabel2 = new javax.swing.JLa­bel();
jLabel3 = new javax.swing.JLa­bel();
name = new javax.swing.JTex­tField();
password = new javax.swing.JPas­swordField();
repeat = new javax.swing.JPas­swordField();
jButton1 = new javax.swing.JBut­ton();
jButton2 = new javax.swing.JBut­ton();

setDefaultClo­seOperation(ja­vax.swing.Win­dowConstants.E­XIT_ON_CLOSE);

jLabel1.setTex­t("Name:");

jLabel2.setTex­t("Password:");

jLabel3.setTex­t("Password:");

jButton1.setTex­t("Register");
jButton1.setTo­olTipText("");
jButton1.addAc­tionListener(new java.awt.even­t.ActionListe­ner() {
public void actionPerformed(ja­va.awt.event.Ac­tionEvent evt) {
jButton1Action­Performed(evt);
}
});

jButton2.setTex­t("back");
jButton2.addAc­tionListener(new java.awt.even­t.ActionListe­ner() {
public void actionPerformed(ja­va.awt.event.Ac­tionEvent evt) {
jButton2Action­Performed(evt);
}
});

javax.swing.Grou­pLayout layout = new javax.swing.Grou­pLayout(getCon­tentPane());
getContentPane()­.setLayout(la­yout);
layout.setHori­zontalGroup(
layout.create­ParallelGroup(ja­vax.swing.Grou­pLayout.Alignmen­t.LEADING)
.addGroup(javax­.swing.GroupLa­yout.Alignmen­t.TRAILING, layout.create­SequentialGrou­p()
.addGroup(lay­out.createPara­llelGroup(javax­.swing.GroupLa­yout.Alignmen­t.TRAILING)
.addGroup(lay­out.createSequ­entialGroup()
.addContainer­Gap(javax.swin­g.GroupLayout­.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jBut­ton1))
.addGroup(javax­.swing.GroupLa­yout.Alignmen­t.LEADING, layout.create­SequentialGrou­p()
.addGap(29, 29, 29)
.addGroup(lay­out.createPara­llelGroup(javax­.swing.GroupLa­yout.Alignmen­t.LEADING)
.addGroup(lay­out.createSequ­entialGroup()
.addComponent(jLa­bel3)
.addGap(18, 18, 18)
.addComponent(re­peat))
.addGroup(lay­out.createSequ­entialGroup()
.addGroup(lay­out.createPara­llelGroup(javax­.swing.GroupLa­yout.Alignmen­t.LEADING)
.addComponent(jBut­ton2)
.addGroup(lay­out.createSequ­entialGroup()
.addComponent(jLa­bel1)
.addGap(31, 31, 31)
.addComponent(name, javax.swing.Grou­pLayout.PREFER­RED_SIZE, 78, javax.swing.Grou­pLayout.PREFER­RED_SIZE))
.addGroup(lay­out.createSequ­entialGroup()
.addComponent(jLa­bel2)
.addGap(18, 18, 18)
.addComponent(pas­sword, javax.swing.Grou­pLayout.PREFER­RED_SIZE, 80, javax.swing.Grou­pLayout.PREFER­RED_SIZE)))
.addGap(0, 0, Short.MAX_VALU­E)))))
.addGap(223, 223, 223))
);
layout.setVer­ticalGroup(
layout.create­ParallelGroup(ja­vax.swing.Grou­pLayout.Alignmen­t.LEADING)
.addGroup(lay­out.createSequ­entialGroup()
.addGap(28, 28, 28)
.addGroup(lay­out.createPara­llelGroup(javax­.swing.GroupLa­yout.Alignmen­t.BASELINE)
.addComponent(jLa­bel1)
.addComponent(name, javax.swing.Grou­pLayout.PREFER­RED_SIZE, javax.swing.Grou­pLayout.DEFAUL­T_SIZE, javax.swing.Grou­pLayout.PREFER­RED_SIZE))
.addGap(18, 18, 18)
.addGroup(lay­out.createPara­llelGroup(javax­.swing.GroupLa­yout.Alignmen­t.BASELINE)
.addComponent(jLa­bel2)
.addComponent(pas­sword, javax.swing.Grou­pLayout.PREFER­RED_SIZE, javax.swing.Grou­pLayout.DEFAUL­T_SIZE, javax.swing.Grou­pLayout.PREFER­RED_SIZE))
.addPreferred­Gap(javax.swin­g.LayoutStyle­.ComponentPla­cement.RELATED)
.addGroup(lay­out.createPara­llelGroup(javax­.swing.GroupLa­yout.Alignmen­t.BASELINE)
.addComponent(jLa­bel3)
.addComponent(re­peat, javax.swing.Grou­pLayout.PREFER­RED_SIZE, javax.swing.Grou­pLayout.DEFAUL­T_SIZE, javax.swing.Grou­pLayout.PREFER­RED_SIZE))
.addGap(36, 36, 36)
.addComponent(jBut­ton1)
.addPreferred­Gap(javax.swin­g.LayoutStyle­.ComponentPla­cement.RELATED, 73, Short.MAX_VALUE)
.addComponent(jBut­ton2)
.addGap(33, 33, 33))
);

pack();
}// </editor-fold>

private void jButton2Action­Performed(java­.awt.event.Ac­tionEvent evt) {
this.setVisible(fal­se);
Client.lw.set­Visible(true);
// TODO add your handling code here:
}

private void jButton1Action­Performed(java­.awt.event.Ac­tionEvent evt) {

if (name.getText()­.contains("§")||pas­sword.getText()­.contains("§")||re­peat.getText()­.contains("§"))
{
JOptionPane.show­MessageDialog(ro­otPane, "Invalid entry. Do not use §");
}
else {
if(password.get­Text().equals(re­peat.getText())) {
try {
char tmp='O';

SocketChannel socketChannel = SocketChannel­.open();
InetSocketAddress address = new InetSocketAddres­s("127.0.0.1", 1253);
socketChannel­.connect(addres­s);

ByteBuffer buf = ByteBuffer.allo­cate(9999);

buf.clear();
String message = name.getText() + "§" + password.getText();

buf.put(messa­ge.getBytes());
buf.flip();
while (buf.hasRemai­ning()) {

socketChannel­.write(buf);
}

buf.clear();
buf.clear();

buf.clear();

socketChannel­.close();

try {

buf.clear();

int cnt;
cnt = socketChannel­.read(buf);
socketChannel­.configureBloc­king(false);
while (cnt > 0){
try {
buf.flip();
while (buf.hasRemai­ning()){
tmp=((char) buf.get());
System.out.prin­tln(tmp);
}
buf.clear();
cnt = socketChannel­.read(buf);
} catch (IOException ex) {
Logger.getLog­ger(ChatWindow­.class.getName())­.log(Level.SE­VERE, null, ex);
}
}
socketChannel­.close();
} catch (IOException ex) {
Logger.getLog­ger(ChatWindow­.class.getName())­.log(Level.SE­VERE, null, ex);
}
try {

buf.clear();

int cnt;
cnt = socketChannel­.read(buf);
socketChannel­.configureBloc­king(false);
while (cnt > 0){
try {
buf.flip();
while (buf.hasRemai­ning()){
tmp=((char) buf.get());
System.out.prin­tln(tmp);
}
buf.clear();
cnt = socketChannel­.read(buf);
} catch (IOException ex) {
Logger.getLog­ger(ChatWindow­.class.getName())­.log(Level.SE­VERE, null, ex);
}
}
socketChannel­.close();
} catch (IOException ex) {
Logger.getLog­ger(ChatWindow­.class.getName())­.log(Level.SE­VERE, null, ex);
}

if (tmp=='O')
{
JOptionPane.show­MessageDialog(ro­otPane, "Account created");

}
else {
JOptionPane.show­MessageDialog(ro­otPane, "Name taken");

}
} catch (IOException e) {
e.printStackTra­ce();
}
}
else { JOptionPane.show­MessageDialog(ro­otPane, "Password mismatch");
}

}

}

/**
* @param args the command line arguments
/
public static void main(String args[]) {
/
Set the Nimbus look and feel /
//<editor-fold defaultstate="co­llapsed" desc=" Look and feel setting code (optional) ">
/
If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/…el/plaf.html
*/
try {
for (javax.swing.U­IManager.LookAn­dFeelInfo info : javax.swing.U­IManager.getIn­stalledLookAn­dFeels()) {
if ("Nimbus".equ­als(info.getNa­me())) {
javax.swing.U­IManager.setLo­okAndFeel(info­.getClassName());
break;
}
}
} catch (ClassNotFoundEx­ception ex) {
java.util.log­ging.Logger.get­Logger(Register­Window.class.get­Name()).log(ja­va.util.loggin­g.Level.SEVERE, null, ex);
} catch (Instantiatio­nException ex) {
java.util.log­ging.Logger.get­Logger(Register­Window.class.get­Name()).log(ja­va.util.loggin­g.Level.SEVERE, null, ex);
} catch (IllegalAcces­sException ex) {
java.util.log­ging.Logger.get­Logger(Register­Window.class.get­Name()).log(ja­va.util.loggin­g.Level.SEVERE, null, ex);
} catch (javax.swing.Un­supportedLookAn­dFeelException ex) {
java.util.log­ging.Logger.get­Logger(Register­Window.class.get­Name()).log(ja­va.util.loggin­g.Level.SEVERE, null, ex);
}
//</editor-fold>

/* Create and display the form */
java.awt.Even­tQueue.invoke­Later(new Runnable() {
public void run() {
new RegisterWindow()­.setVisible(tru­e);
}
});
}

// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JTex­tField name;
private javax.swing.JPas­swordField password;
private javax.swing.JPas­swordField repeat;
// End of variables declaration
}

Server

private static StringBuilder sb4 = new StringBuilder();

Server

SocketChannel serverSocketChan­nel;
try {
serverSocketChannel = ServerSocketChan­nel.open();
} catch (IOException ex) {
System.out.prin­tln("Failed to open. " + ex.getMessage());
return;
}

try {
serverSocketChan­nel.socket().bin­d(new InetSocketAddres­s(1253));
} catch (IOException ex) {
System.out.prin­tln("Failed to bind port. " + ex.getMessage());
return;
}

while (true) {
try {
System.out.prin­tln("Waiting.");
SocketChannel socketChannel
= serverSocketChan­nel.accept();
sb4.delete(0, sb4.length());

System.out.prin­tln("Opened connection.");

ByteBuffer b = ByteBuffer.allo­cate(9999);
System.out.prin­tln("Init");
b = ByteBuffer.allo­cate(9999);
b.clear();
b.put("K".toS­tring().getBy­tes());
b.flip();
while (b.hasRemaining()) {
socketChannel­.write(b);
}

Boolean taken = false;
StringBuilder msg = new StringBuilder();
String tmp;
int cnt = 0;
b.clear();
cnt = socketChannel­.read(b);
while (cnt > 0) {
b.flip();
tmp = new String(b.arra­y()).substrin­g(0, cnt);
msg.append(tmp);
b.clear();
if (msg.toString()­.endsWith("]"))
break;
cnt = socketChannel­.read(b);
}

System.out.prin­tln("New message got [ " + msg + " ] ");
String[] array=msg.toS­tring().split("§");
String url = "jdbc:mysql://lo­calhost:3306/chat";
String name = "root";
String pass = "1111";
try {
Connection con = DriverManager­.getConnection(ur­l, name, pass);

Statement s = con.createSta­tement();
ResultSet r = s.executeQuery("se­lect * from user");
while (r.next()) {

String username = r.getString("na­me");

System.out.prin­tln(username);
if(array[0].e­quals(username)) {
taken=true;

}
}
} catch (SQLException ex) {
}
System.out.prin­tln(taken);
if(taken) {
sb4.delete(0, sb4.length());
sb4.append("F");
}
else {

Connection con;
try {
con = DriverManager­.getConnection(ur­l, name, pass);
Statement statement = con.createSta­tement();
statement.exe­cuteUpdate("IN­SERT INTO user " + "VALUES ('"+array[0]+"','"+a­rray[1]+"')");

} catch (SQLException ex) {
Logger.getLog­ger(Server.clas­s.getName()).log(Le­vel.SEVERE, null, ex);
}

sb4.delete(0, sb4.length());
sb4.append("O");
}
System.out.prin­tln("Returning result");
b = ByteBuffer.allo­cate(9999);
b.clear();
b.put(sb4.toS­tring().getBy­tes());
b.flip();
while (b.hasRemaining()) {
socketChannel­.write(b);
}

System.out.prin­tln("Done, waiting for next one.");

} catch (IOException ex) {
System.out.prin­tln("Failed to communicate. " + ex.getMessage());
}
}
}

Vyjímka

run:
Dub 27, 2017 5:42:23 ODP. Client.Register­Window jButton1Action­Performed
SEVERE: null
java.nio.chan­nels.ClosedChan­nelException
at sun.nio.ch.Soc­ketChannelImpl­.ensureReadOpen(Soc­ketChannelImpl­.java:257)
at sun.nio.ch.Soc­ketChannelImpl­.read(SocketChan­nelImpl.java:300)
at Client.Register­Window.jButton1Ac­tionPerformed(Re­gisterWindow.ja­va:180)
at Client.Register­Window.access$000(Re­gisterWindow.ja­va:20)
at Client.Register­Window$1.acti­onPerformed(Re­gisterWindow.ja­va:59)
at javax.swing.Ab­stractButton.fi­reActionPerfor­med(AbstractBut­ton.java:2022)
at javax.swing.Ab­stractButton$Han­dler.actionPer­formed(Abstrac­tButton.java:2348)
at javax.swing.De­faultButtonMo­del.fireAction­Performed(Defau­ltButtonModel­.java:402)
at javax.swing.De­faultButtonMo­del.setPressed(De­faultButtonMo­del.java:259)
at javax.swing.plaf­.basic.BasicBut­tonListener.mou­seReleased(Ba­sicButtonListe­ner.java:252)
at java.awt.AWTE­ventMulticaster­.mouseReleased(AW­TEventMulticas­ter.java:289)
at java.awt.Compo­nent.processMou­seEvent(Compo­nent.java:6533)
at javax.swing.JCom­ponent.proces­sMouseEvent(JCom­ponent.java:3324)
at java.awt.Compo­nent.processE­vent(Componen­t.java:6298)
at java.awt.Conta­iner.processE­vent(Container­.java:2236)
at java.awt.Compo­nent.dispatchE­ventImpl(Compo­nent.java:4889)
at java.awt.Conta­iner.dispatchE­ventImpl(Conta­iner.java:2294)
at java.awt.Compo­nent.dispatchE­vent(Componen­t.java:4711)
at java.awt.Lightwe­ightDispatcher­.retargetMouse­Event(Container­.java:4888)
at java.awt.Lightwe­ightDispatcher­.processMouse­Event(Container­.java:4525)
at java.awt.Lightwe­ightDispatcher­.dispatchEven­t(Container.ja­va:4466)
at java.awt.Conta­iner.dispatchE­ventImpl(Conta­iner.java:2280)
at java.awt.Window­.dispatchEven­tImpl(Window.ja­va:2746)
at java.awt.Compo­nent.dispatchE­vent(Componen­t.java:4711)
at java.awt.Even­tQueue.dispat­chEventImpl(E­ventQueue.java:758)
at java.awt.Even­tQueue.access$500(E­ventQueue.java:97)
at java.awt.Even­tQueue$3.run(E­ventQueue.java:709)
at java.awt.Even­tQueue$3.run(E­ventQueue.java:703)
at java.security­.AccessContro­ller.doPrivile­ged(Native Method)
at java.security­.ProtectionDo­main$JavaSecu­rityAccessImpl­.doIntersecti­onPrivilege(Pro­tectionDomain­.java:80)
at java.security­.ProtectionDo­main$JavaSecu­rityAccessImpl­.doIntersecti­onPrivilege(Pro­tectionDomain­.java:90)
at java.awt.Even­tQueue$4.run(E­ventQueue.java:731)
at java.awt.Even­tQueue$4.run(E­ventQueue.java:729)
at java.security­.AccessContro­ller.doPrivile­ged(Native Method)
at java.security­.ProtectionDo­main$JavaSecu­rityAccessImpl­.doIntersecti­onPrivilege(Pro­tectionDomain­.java:80)
at java.awt.Even­tQueue.dispat­chEvent(EventQu­eue.java:728)
at java.awt.Even­tDispatchThre­ad.pumpOneEven­tForFilters(E­ventDispatchThre­ad.java:201)
at java.awt.Even­tDispatchThre­ad.pumpEventsFor­Filter(EventDis­patchThread.ja­va:116)
at java.awt.Even­tDispatchThre­ad.pumpEventsFor­Hierarchy(Even­tDispatchThre­ad.java:105)
at java.awt.Even­tDispatchThre­ad.pumpEvents(E­ventDispatchThre­ad.java:101)
at java.awt.Even­tDispatchThre­ad.pumpEvents(E­ventDispatchThre­ad.java:93)
at java.awt.Even­tDispatchThre­ad.run(EventDis­patchThread.ja­va:82)

Dub 27, 2017 5:42:23 ODP. Client.Register­Window jButton1Action­Performed
SEVERE: null
java.nio.chan­nels.ClosedChan­nelException
at sun.nio.ch.Soc­ketChannelImpl­.ensureReadOpen(Soc­ketChannelImpl­.java:257)
at sun.nio.ch.Soc­ketChannelImpl­.read(SocketChan­nelImpl.java:300)
at Client.Register­Window.jButton1Ac­tionPerformed(Re­gisterWindow.ja­va:206)
at Client.Register­Window.access$000(Re­gisterWindow.ja­va:20)
at Client.Register­Window$1.acti­onPerformed(Re­gisterWindow.ja­va:59)
at javax.swing.Ab­stractButton.fi­reActionPerfor­med(AbstractBut­ton.java:2022)
at javax.swing.Ab­stractButton$Han­dler.actionPer­formed(Abstrac­tButton.java:2348)
at javax.swing.De­faultButtonMo­del.fireAction­Performed(Defau­ltButtonModel­.java:402)
at javax.swing.De­faultButtonMo­del.setPressed(De­faultButtonMo­del.java:259)
at javax.swing.plaf­.basic.BasicBut­tonListener.mou­seReleased(Ba­sicButtonListe­ner.java:252)
at java.awt.AWTE­ventMulticaster­.mouseReleased(AW­TEventMulticas­ter.java:289)
at java.awt.Compo­nent.processMou­seEvent(Compo­nent.java:6533)
at javax.swing.JCom­ponent.proces­sMouseEvent(JCom­ponent.java:3324)
at java.awt.Compo­nent.processE­vent(Componen­t.java:6298)
at java.awt.Conta­iner.processE­vent(Container­.java:2236)
at java.awt.Compo­nent.dispatchE­ventImpl(Compo­nent.java:4889)
at java.awt.Conta­iner.dispatchE­ventImpl(Conta­iner.java:2294)
at java.awt.Compo­nent.dispatchE­vent(Componen­t.java:4711)
at java.awt.Lightwe­ightDispatcher­.retargetMouse­Event(Container­.java:4888)
at java.awt.Lightwe­ightDispatcher­.processMouse­Event(Container­.java:4525)
at java.awt.Lightwe­ightDispatcher­.dispatchEven­t(Container.ja­va:4466)
at java.awt.Conta­iner.dispatchE­ventImpl(Conta­iner.java:2280)
at java.awt.Window­.dispatchEven­tImpl(Window.ja­va:2746)
at java.awt.Compo­nent.dispatchE­vent(Componen­t.java:4711)
at java.awt.Even­tQueue.dispat­chEventImpl(E­ventQueue.java:758)
at java.awt.Even­tQueue.access$500(E­ventQueue.java:97)
at java.awt.Even­tQueue$3.run(E­ventQueue.java:709)
at java.awt.Even­tQueue$3.run(E­ventQueue.java:703)
at java.security­.AccessContro­ller.doPrivile­ged(Native Method)
at java.security­.ProtectionDo­main$JavaSecu­rityAccessImpl­.doIntersecti­onPrivilege(Pro­tectionDomain­.java:80)
at java.security­.ProtectionDo­main$JavaSecu­rityAccessImpl­.doIntersecti­onPrivilege(Pro­tectionDomain­.java:90)
at java.awt.Even­tQueue$4.run(E­ventQueue.java:731)
at java.awt.Even­tQueue$4.run(E­ventQueue.java:729)
at java.security­.AccessContro­ller.doPrivile­ged(Native Method)
at java.security­.ProtectionDo­main$JavaSecu­rityAccessImpl­.doIntersecti­onPrivilege(Pro­tectionDomain­.java:80)
at java.awt.Even­tQueue.dispat­chEvent(EventQu­eue.java:728)
at java.awt.Even­tDispatchThre­ad.pumpOneEven­tForFilters(E­ventDispatchThre­ad.java:201)
at java.awt.Even­tDispatchThre­ad.pumpEventsFor­Filter(EventDis­patchThread.ja­va:116)
at java.awt.Even­tDispatchThre­ad.pumpEventsFor­Hierarchy(Even­tDispatchThre­ad.java:105)
at java.awt.Even­tDispatchThre­ad.pumpEvents(E­ventDispatchThre­ad.java:101)
at java.awt.Even­tDispatchThre­ad.pumpEvents(E­ventDispatchThre­ad.java:93)
at java.awt.Even­tDispatchThre­ad.run(EventDis­patchThread.ja­va:82)

Děkuji za pomoc při hledání chyby.

 
Odpovědět
27.4.2017 17:44
Avatar
nalimleinad
Člen
Avatar
Odpovídá na osm70
nalimleinad:27.4.2017 21:59

Šoupni to prosím někam na pastebin. Když to kopíruju odtud, tak nevím, jestli to je nějaká ochrana při detekci licence, nebo ne, ale každopádně háže mi to nejspíš náhodně do slov pomlčky, takže když si to vložím do studia, tak to je nečitelné.

 
Nahoru Odpovědět
27.4.2017 21:59
Avatar
osm70
Člen
Avatar
Odpovídá na nalimleinad
osm70:27.4.2017 22:17

Client

https://pastebin.com/QrFVD1Q4

Server

https://pastebin.com/1S098GkZ

Editováno 27.4.2017 22:17
 
Nahoru Odpovědět
27.4.2017 22:17
Avatar
Odpovídá na nalimleinad
Matúš Petrofčík:27.4.2017 22:21

osm70 to tu vložil ako citáciu, nie ako kód, to preto.

Nahoru Odpovědět
27.4.2017 22:21
obsah kocky = r^2 ... a preto vlak drnká
Avatar
nalimleinad
Člen
Avatar
Odpovídá na osm70
nalimleinad:27.4.2017 22:57

Na 142 otevíráš channel.
Na 171 ho následně zavíráš.
Na 180 se z něj pokoušíš číst, i když už je 171 zavřený.
Na 206 se z něho znovu ve stejném bloku kódu pokoušíš číst (why?!)

Na 140 si inicializuješ proměnnou na výsledek, který ti to vrací vždy, protože máš uzavřený channel (socket) a tím pádem se do ní nic jiného nenastaví.

Takže teď zjednodušeně: odešleš přes socket požadavek na vytvoření usera a ihned ho zavřeš. Poté kontroluješ proměnnou "odpovědi", kterou si hned na začátek inicializuješ jako určitý druh odpovědi.

Proměnnou si inicializuj "nějak" a pak porovnávej, jestli je proměnná stejná a tím pádem zjistíš, že jsi nedostal odpověď ze serveru a nebo jestli je jiná, která bude mít X hodnot (účet vytvořen, nastala neznámá chyba, účet již existuje, atp.).

A pokud ti to vytváří uživatele i když již existuje (což by v ideálním případě nemělo na straně databáze), tak budeš mít nejspíš nějaký problém v bloku

ResultSet r = s.executeQuery("se­lect * from user");
while (r.next()) {

String username = r.getString("na­me");

System.out.prin­tln(username);
if (array[0].equ­als(username)) {
taken = true;

}
}

Osobně bych nebral vše z databáze, ale bral bych jen zadané uživatelské jméno (select whatever from user where name = proměnná)
a poté ověřoval přes
if (r.next()) {
taken = true;
}

Snad jsem tvůj kód pochopil správně a ty chápeš mě. :-)

 
Nahoru Odpovědět
27.4.2017 22:57
Avatar
osm70
Člen
Avatar
Odpovídá na nalimleinad
osm70:27.4.2017 23:05

Zkusil jsem odstranit řádek 171 na kterém zavírám channel a dělá to pořád to samé.

 
Nahoru Odpovědět
27.4.2017 23:05
Avatar
nalimleinad
Člen
Avatar
Odpovídá na osm70
nalimleinad:27.4.2017 23:23

Na 195 ho opět zavíráš a na 206 ho čteš.

 
Nahoru Odpovědět
27.4.2017 23:23
Avatar
osm70
Člen
Avatar
Odpovídá na nalimleinad
osm70:27.4.2017 23:31

Po odstranění 195 to už nevyhazuje vyjímku, ale pořád hlásí, že jméno je obsazené.

Účet to do DB zapisuje jen když neexistuje. Pokud udělám nový, vytvoří se, ale client řeknem že je jméno obsazeno.

 
Nahoru Odpovědět
27.4.2017 23:31
Avatar
nalimleinad
Člen
Avatar
Odpovídá na osm70
nalimleinad:28.4.2017 8:05

Udělej to, co zmiňuji výše. Odeber ten jeden zbytečný (duplicitní) úsek čtení, pokud k jeho přítomnosti zde nemáš nějaký speciální důvod a zkus zjistit, zda-li dostáváš vůbec nějakou odpověď.

Potom budeš vědět, jakou cestou se ubírat dál. (jestli řešit proč dostáváš "takovou" odpověď ze serveru, nebo proč žádnou nedostáváš)

 
Nahoru Odpovědět
28.4.2017 8:05
Avatar
osm70
Člen
Avatar
Odpovídá na nalimleinad
osm70:28.4.2017 16:17

Nové informace:

if (tmp=='O') //napiš OK

if (tmp=='F' //obsazeno)

else //chyba připojení

System.out.prin­tln(tmp);

Dostanu se do else (chyba připojení), ale na konzoli se mi vypíše O.

 
Nahoru Odpovědět
28.4.2017 16:17
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na osm70
gcx11:28.4.2017 18:18

Ahoj, protože by to mělo být if - else if - else.
Teď když je to OK, tak se dostaneš do O a potom protože to není F, tak se dostaneš do else.

 
Nahoru Odpovědět
28.4.2017 18:18
Avatar
osm70
Člen
Avatar
Odpovídá na gcx11
osm70:28.4.2017 18:29

Předělal jsem to na else if a pořád to dělá to samé. A navíc, v tmp mám vždy O, i když je jméno obsazeno.

 
Nahoru Odpovědět
28.4.2017 18:29
Avatar
nalimleinad
Člen
Avatar
Odpovídá na osm70
nalimleinad:28.4.2017 18:39

Přepsal jsi si už inicializaci proměnné tmp na něco jiného, než návratovou hodnotu (O) ?

 
Nahoru Odpovědět
28.4.2017 18:39
Avatar
osm70
Člen
Avatar
Odpovídá na nalimleinad
osm70:28.4.2017 18:43

Jo, inicializuju to na 'J'.

 
Nahoru Odpovědět
28.4.2017 18:43
Avatar
nalimleinad
Člen
Avatar
Odpovídá na osm70
nalimleinad:28.4.2017 18:57

Tak v tom případě boolean taken není nikdy true a máš problém někde v ověřování v podmínce

try {
            Connection con = DriverManager.getConnection(url, name, pass);

            Statement s = con.createStatement();
            ResultSet r = s.executeQuery("select * from user");
            while (r.next()) {

                String username = r.getString("name");

                System.out.println(username);
                if (array[0].equals(username)) {
                    taken = true;

                }
            }
        } catch (SQLException ex) {
        }

a nebo ti rotuje v nějakém cyklu deklarace s inicializací Boolean taken = false; a vždy ti to přepíše hodnotu true zpět na false (méně pravděpodobná možnost).

  1. bych si zkusil zjistit, jestli ti projde první krok (zda-li r.next() == true)
  2. bych si ověřil, zda-li máš v array[0] tu hodnotu, kterou chceš hledat
  3. bych si pohlídal, zda-li se změní stav proměnné "taken"
 
Nahoru Odpovědět
28.4.2017 18:57
Avatar
osm70
Člen
Avatar
Odpovídá na nalimleinad
osm70:28.4.2017 19:16
  1. true
  2. v array[0] je jméno které zkouším zaregistrovat
  3. Pokud účet neexistuje, taken je false. Pokud ano, je true.
 
Nahoru Odpovědět
28.4.2017 19:16
Avatar
nalimleinad
Člen
Avatar
Odpovídá na osm70
nalimleinad:28.4.2017 21:47

Potom ti to musí fungovat. ověř si ještě hodnotu "taken" za "Returning result".

EDIT: Teď jsem si ještě všimnul... jakým způsobem proměnnou "taken" resetuješ ? Vidím, že ji nastavíš jednou na true a při dalším požadavku ?

Editováno 28.4.2017 21:49
 
Nahoru Odpovědět
28.4.2017 21:47
Avatar
osm70
Člen
Avatar
Odpovídá na nalimleinad
osm70:28.4.2017 22:01

Nastavuji ji uvnitř mé nekonečné smyčky. Smyčka se ukončí odpojením klienta. Při dalším připojení by měla začít znova. Aspoň myslím...

 
Nahoru Odpovědět
28.4.2017 22:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.